Java中主要提供两种方式实现线程,分别为继承java.lang.Thread类和实现java.lang.Runnable接口。
1.继承Thread类
Thread类是java.lang包中的一个类,从这个类中实例化的对象代表线程,程序员启动一个新线程需要建立Thread实例。Thread类中常用的两个构造方法如下:
public Thread(String threadName);
public Thread();
完成线程真正功能的代码放在类的run()方法中,当一个类继承Thread类后,就可以在类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后调用Thread类中的start()方法执行线程,也就是调用run()方法。
2.实现Runnable接口
实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有如下两个构造方法:
public Thread(Runnable r);
public Thread(Runnable r,String name);
在这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。
3.线程的生命周期
线程具有生命周期,其中包含7种状态,分别为出生状态、就绪状态、执行状态、等待状态、休眠状态、阻塞状态和死亡状态。
4.操作线程的方法
(1)线程的休眠
sleep()方法
(2)线程的挂起
join()方法
当某个线程使用join()方法加入到另外一个线程时,另一个线程会等待该线程执行完毕再继续执行。
(3)线程的中断
在run()方法中使用无线循环的形式,然后使用一个布尔型标记控制循环的停止。
(4)线程的礼让
Thread类提供了一种礼让方法,使用yield()方法表示,它只是给当前正处于运行状态下的线程一个提醒,告知它可以讲资源礼让给其它线程。但这仅仅是一种暗示,没有任何一种机制保证当前线程会将资源礼让。
5.线程的优先级
Thread.MIN_PRIORITY(1)~Thread.MAX_PRIORITY(10)
默认情况在优先级是Thread.NORM_PRIORITY(5)
线程的优先级可以使用setPriority()方法调整。
6.线程同步
(1)同步块
Java中提供了同步机制,可以有效的防止资源冲突。同步机制使用synchronized关键字。
同步块也被称为临界区,它使用synchronized关键字建立。其语法如下:
Synchronized(Object){
......
}
通常将共享资源的操作放置在synchronized定义的区域内,这样当其它线程也获取到这个锁时,必须等待锁被释放时才能进入该区域。Object为任意一个对象,每个对象都存在一个标志位,并具有两个值,分别为0和1。
(2)同步方法
同步方法就是在方法前面修饰synchronized关键字的方法,其语法如下:
Synchronized void f(){
}
当某个对象调用了同步方法,该对象上的其它同步方法必须等待该同步方法执行完毕才能被执行。
7.线程间的通信
线程之间的通信使用wait()、notify()以及notifAll()方法实现。
使用wait()方法有以下两种形式:
wait(time)
wait()
第一种形式的wait()方法与sleep()方法的含义相同,都是指在此时间之内暂停;而第二种形式的wait()方法会使线程永久无限的等待下去,需要使用notify()或者notifyAll()方法唤醒。
注意:wait()、notify()以及notifAll()方法只能在同步块或同步方法中使用。