在Java中可以通过创建多线程来达到并发编程的目的。
线程
Java中的线程(Thread)的生命周期是这样的:
- 实例化一个线程对象后,线程处于新建状态,等待进入就绪状态。
- 调用
start()
后,线程进入就绪状态,等待被JVM的线程调度器调度进入运行状态。
- 调用
run()
后,线程进入运行状态,运行状态的线程可能进入阻塞状态、就绪状态、死亡状态。
- 运行状态的线程如果调用了
sleep()
或者suspend()
后会失去所有资源,线程进入阻塞状态,阻塞状态的线程在睡眠时间到后或者获得资源后会重新进入就绪状态。
- run()执行完毕、调用
stop()
、调用destroy()
,线程会进入死亡状态。
线程进入阻塞状态有三种情况:
- 等待阻塞状态:运行状态的线程调用
wait()
进入等待阻塞状态。
- 同步阻塞状态:运行状态的线程获取
synchronized
同步锁失败(同步锁被其他线程占用)会进入同步阻塞状态。
- 其他阻塞状态:线程调用
sleep()
、join()
IO请求,线程会进入阻塞状态,当sleep超时或者join终止或者超时,或者IO完毕,线程会重新进入就绪状态等待被JVM调度。
线程的优先级
每个线程都有一个优先级,默认优先级 NORM_PRIORITY(5)
。
JVM根据线程优先级调度资源。
创建线程
Java提供三种方法创建线程:
- 实现
Runnable
接口。
- 继承
Thread
类。
- 实现
Callable
和 Future
接口来创建线程。
实现Runnable接口来创建线程
ThreadDemo.java1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class RunnableDemo implements Runnable {
private Thread t; private String threadName;
RunnableDemo(String name) { threadName = name; System.out.println("Creating " + threadName ); } public void run() { System.out.println("Running " + threadName );
try { for(int i = 4; i > 0; i--) { System.out.println("Thread: " + threadName + ", " + i); Thread.sleep(50); } } catch (InterruptedException e) { System.out.println("Thread " + threadName + " interrupted."); }
System.out.println("Thread " + threadName + " exiting."); } public void start () { System.out.println("Starting " + threadName ); if (t == null) { t = new Thread (this, threadName); t.start (); } } }
public class ThreadDemo {
public static void main(String args[]) { RunnableDemo R1 = new RunnableDemo( "Thread-1"); R1.start(); RunnableDemo R2 = new RunnableDemo( "Thread-2"); R2.start(); } }
|
继承Thread类来创建线程
继承Thread
类,其他代码相同。
实现Callable和Future接口来创建线程
略