在Java中,实现多线程需要使用Thread类.
Thread类的定义
public class Thread extends Object implements Runnable
void |
run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
void |
start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 |
实现多线程方式1:
自定义类继承Thread类.
在自定义类中重写run()方法.
创建对象.
启动线程
线程有两种调度模型
分时调度模型
所有的线程轮流使用CPU的使用权,平均分配每个线程占用的CPU时间片.
抢占式调度模型
优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取CPU时间片相对多一些.
Java使用的是抢占式的调度模型.
Thread类的方法
线程的优先级的设置
java.lang.Thread |
|
|
public static final int |
10 |
|
public static final int |
1 |
|
public static final int |
5 |
线程的休眠的设置
static void |
sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。 |
线程的礼让
static void |
yield() 暂停当前正在执行的线程对象,并执行其他线程。 |
线程礼让能在一定的程序上让线程分配更均衡一些.
守护线程
void |
setDaemon(boolean on) 将该线程标记为守护线程或用户线程。 |
被标记为守护线程的程序,在主线程退出后守护线程也推出.
线程终止
public final void stop() 强迫线程停止执行。 |
stop方法官方不建议使用, stop会直接停止掉线程,不会继续向下执行.具有安全隐患.
终止线程
void |
中断线程。 |
把线程的状态中止,并抛出一个异常.
实现多线程方式二
自定义类实现Runable接口
在自定义类中重写run方法
创建自定义类的对象.
创建Thread类的对象,并把自定义类的对象作为构造参数传递.
练习题,模拟售票程序,假设一共100张票,有三个窗口同时售票.
方式 1,继承Thread类的方式
方式2,实现Runable接口的方式.
为了模拟真实情况,将程序里设置100ms的延迟.
从结果种可以看出,有一张票卖出两次的情况以及卖出负数票的情况
有那些问题会导致出问题?
是否多线程环境
是否有共享数据
是否有多条语句操作共享数据
利用synchronized 可以解决此问题. 被synchronized所包含的代码,在任意时刻只能有一个对象执行.
synchronized 关键字同样可以修饰方法
同步代码块的锁对象
任意对象
同步方法的格式及锁对象
把同步关键字加在方法上.
被同步修饰的方法的所对象是?
this,也就是说如果在方法外也有同样的代码需要被锁上,需要同步对象 this.
静态方法及锁对象问题
静态方法的锁对象是类的字节码文件对象.(例如SellTicket.class)
创建线程安全的集合类的方法