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()都只能在同步快或同步方法中使用;

原文地址:https://www.cnblogs.com/QQ931697811/p/4415388.html