Java 多线程
Java中主要有2中方式实现线程
1、继承Thread(需要重写Run方法 Public void Run(){ })
1 Public Class ThreadTest extends Thread
2 {
3 private int count = 0;
4 public void run()
5 {
6 while(true)
7 {
8 System.out.Println(".....");
9 }
10 }
11 }
12 //启动线程
13
14 Public Static void main(String[] args)
15 {
16 new ThreadTest().Start();
17 }
2、实现Runnable接口(推荐)
Public class Thread extends Objects implements Runnable
启动一个线程不是调用 Run() 方法,而是调用 Start() 方法,创建一个新线程,该线程去调用 run() 方法;
线程的状态
新建 运行(可运行) 阻塞 等待 计时等待 和 终止 6种状态
新建(New):当线程New 后处于新建状态,线程已经被创建,但是还没有被启动,这段时间就是出于New 之后,Start 之前;
运行(Runnable):当调用Start() 方法后 线程处于可运行状态(Runnable),出于Runnable状态的线程在JVM上是运行的,但是可能还要等待操作系统分配给它相应的资源得以运行;
阻塞(Blocked)被中断运行:线程正在等在其他线程释放同步锁,以进入一个同步块或者同步方法以继续运行;或者他已经进入某个同步块或同步方法,在运行的过程中,它调用了某个对象继承自java.lang.object的wait()方法,正在等待重新返回这个同步块或同步方法。
等待(Waiting):当前线程调用了java.lang.Object.wait()、 java.lang.Thread.join()或者java.util.concurrent.locks.LockSupport.park()三个 中的任意一个方法,正在等待另外一个线程执行某个操作。比如一个线程调用了某个对象的wait()方法,正在等待其它线程调用这个对象的notify() 或者notifyAll()(这两个方法同样是继承自Object类)方法来唤醒它;或者一个线程调用了另一个线程的join()(这个方法属于 Thread类)方法,正在等待这个方法运行结束。
计时等待(Timed-Waiting):当前线程调用了 java.lang.Object.wait(long timeout)、java.lang.Thread.join(long millis)、java.util.concurrent.locks.LockSupport.packNanos(long nanos)、java.util.concurrent.locks.LockSupport.packUntil(long deadline)四个方法中的任意一个,进入等待状态,但是与WAITING状态不同的是,它有一个最大等待时间,即使等待的条件仍然没有满足,只要到 了这个时间它就会自动醒来。
终止(Terminated):线程完成执行后的状态。线程执行完run()方法中的全部代码,从该方法中退出,进入TERMINATED状态。还有一种情况是run()在运行过程中抛出了一个异常,而这个异常没有被程序捕获,导致这个线程异常终止进入terminated状态。
线程间的通信:
线程间通信主要通过wait(),notify(),notifyAll()方法实现,我们知道当调用wait() 之后,该线程从运行状态变成就绪状态,和Sleep()一样,但是两者之间有什么差别呢?从同步的角度上讲,调用sleep()方法的线程不释放锁,调用wait()方法的线程释放锁。
调用wait()方法两种形式:
- wai(time)
- wait()
wait(time)和sleep(time)一样,都是说线程在一定时间暂停,wait()方法,会使得线程无限制的暂停,需要notify()或者notifyAll()唤醒,
注意:wait()与notify()、notifyAll()都只能在同步快或同步方法中使用;