《小白兔到大黑牛》第九篇多线程实现的俩种方式

来源:互联网 发布:当今网络世界强国 编辑:程序博客网 时间:2024/04/28 05:31

/**
* Created by ch on 17-7-16.
* java 多线程 锁机制
*
* 多线程
*(1)多线程具有的五个基本状态
* 1.新建状态(new):对象被创建后,进入了新的状态,Thread thread=new Thread();
* 2.就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进
* 入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,
* 并不是说执行了t.start()此线程立即就会执行;
* 3.运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。
* 4.阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,
* 直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、
join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
*
*二.java中线程创建的俩种基本形式
* 1.继承Thread重写run方法.
*
*/

class MyThread extends Thread {    private int i = 0;    @Override    public void run() {        for (i = 0; i < 100; i++) {            System.out.println(Thread.currentThread().getName() + " " + i);        }    }}public class ThreadTest {    public static void main(String[] args) {        for (int i = 0; i < 100; i++) {            System.out.println(Thread.currentThread().getName() + " " + i);            if (i == 30) {                Thread myThread1 = new MyThread();     // 创建一个新的线程  myThread1  此线程进入新建状态                Thread myThread2 = new MyThread();     // 创建一个新的线程 myThread2 此线程进入新建状态                myThread1.start();                     // 调用start()方法使得线程进入就绪状态                myThread2.start();                     // 调用start()方法使得线程进入就绪状态            }        }    }}

2.实现Runnable接口并重写该接口的run()方法,该run()方法同样是线程执行体,创建Runnable实现类的实例
并以此实例作为Thread类的target来创建Thread对象,该Thread对象才是真正的线程对象.

class MyRunnable implements Runnable {    private int i = 0;    @Override    public void run() {        for (i = 0; i < 100; i++) {            System.out.println(Thread.currentThread().getName() + " " + i);        }    }}public class ThreadTest {    public static void main(String[] args) {        for (int i = 0; i < 100; i++) {            System.out.println(Thread.currentThread().getName() + " " + i);            if (i == 30) {                Runnable myRunnable = new MyRunnable(); // 创建一个Runnable实现类的对象                Thread thread1 = new Thread(myRunnable); // 将myRunnable作为Thread target创建新的线程                Thread thread2 = new Thread(myRunnable);                thread1.start(); // 调用start()方法使得线程进入就绪状态                thread2.start();            }        }    }}
原创粉丝点击