java多线程

实现多线程的方法

一、拓展java.lang.Thread类
继承Thread类。

class Thread1 extends Thread{
    public Thread1() {}
	public void run() {
		System.out.println("Thread1运行");
	}
}
public class Main {
	public static void main(String[] args) {
		Thread1 mTh1=new Thread1();
		Thread1 mTh2=new Thread1();
		mTh1.start();
		mTh2.start();
	}
}

说明
程序在启动main的时候,java虚拟机也启动一个进程,主线程main在main()调用时候被创建。start()方法调用后并不是立即执行多线程代码,而是使得该线程变为可运行状态(Runnable),什么时候运行由操作系统决定。
Thread.sleep() 方法调用目的是不让其他线程独自霸占该进程所获取的CPU资源,已流出一定时间给其他线程执行的机会。
注意
start方法重复调用的话,会出现java.lang.IllegalThreadStateException异常。

		Thread1 mTh1=new Thread1("A");
		Thread1 mTh2=mTh1;
		mTh1.start();
		mTh2.start();

二、实现java.lang.Runnable接口
需要重写run方法

class Thread2 implements Runnable{
	public Thread2() {}
	public void run() {
		System.out.println("Thread2运行");
	}
	
}
public class Main {
 
	public static void main(String[] args) {
		new Thread(new Thread2()).start();
		new Thread(new Thread2()).start();
	}

}

说明
所有的多线程代码都在run()方法中,Thread类实际上也是实现了Runnable接口的类。
启动多线程时,需要先通过Thread类构造方法构造出对象,然后调用Thread对象的start()方法来运行多线程代码。
所有多线程代码都是通过运行Thread方法的start方法来运行的。

进程状态转换

在这里插入图片描述
1、新建(new):新建了一个线程对象。
2、就绪(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3、运行(Running):就绪状态的线程获取了CPU,执行程序代码。
4、阻塞(Blocked):线程因为某种原因放弃CPU使用权,暂时停止运行,直到线程进入就绪状态才有机会进入到运行状态,阻塞有三种情况:
(一)等待阻塞:线程执行wait()方法,JVM会把该线程放入等待池中(wait会释放持有的锁)。
(二)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)其他阻塞:运行的线程执行sleep方法或join方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep状态超时(sleep不会释放持有的锁),join等待线程终止或者超时,或者I/O处理完毕时,线程重新转入就绪状态。
5、死亡(Dead):线程执行完了或者因异常退出了Run()方法,该线程生命周期结束。

四、线程调度

1、优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会。
2、Java线程的优先级用整数表示,取值范围是1~10,Thread类有以下三个静态常量:

static int MAX_PRIORITY
          线程可以具有的最高优先级,取值为10static int MIN_PRIORITY
          线程可以具有的最低优先级,取值为1static int NORM_PRIORITY
          分配给线程的默认优先级,取值为5

线程调度方法:

1、Thread.sleep(long millis):使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()平台移植性好。
2、wait():Object类中的方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。这个两个唤醒方法也是Object类中的方法,行为等价于调用 wait(0) 一样。
3、Thread.yield():暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
4、join():join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。主线程一定会等子线程都结束了才结束。
5、notify():唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。
6、interrupt() :不要以为它是中断某个线程!它只是线线程发送一个中断信号,让线程在无限等待时(如死锁时)能抛出抛出,从而结束线程,但是如果你吃掉了这个异常,那么这个线程还是不会中断的!
7、

注意:

  • Thread类的setPriority()getPriority() 方法分别用来设置和获取线程的优先级。
  • 每个线程都有默认的优先级。主线程的默认优先级为Thread.NORM_PRIORITY
  • 线程的优先级有继承关系,比如A线程中创建了B线程,那么B将和A具有相同的优先级。
  • Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。

原文:https://blog.youkuaiyun.com/Evankaka/article/details/44153709?utm_source=copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值