线程的状态以及创建多线程的三种方式

首先了解一下线程的五种状态:

  • 新建状态:

    新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内·      						的程序代码。
    
  • 就绪状态:

    简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度。
    
  • 运行状态:

    获得cpu的时间后,调用run()方法,进入运行状态。
    
  • 阻塞状态:

    由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用。
    
  • 死亡状态:

    线程正常执行完毕,或者是中途出现了异常退出了run()。
    
  • 继承Thread类
    最基本的实现多线程的方式,继承Thread类,重写run方法,通过start方法执行。
    由于是继承的关系,所以这种方式也就有了他的局限性,只能有一个直接父类。

package cn.com.dh;

public class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("myThread start...");
        for(int i = 0; i < 30; i++){
            System.out.println("第 "+i + " 次执行。。");
        }
        System.out.println("myThread end!!!");
    }

    public static void main(String[] args) {
        System.out.println("main thread start...");
        new MyThread().start();
        System.out.println("main end!!!");

    }
}

Console打印输出

main thread start...
main end!!!
myThread start...
第 0 次执行。。
第 1 次执行。。
第 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 次执行。。
myThread end!!!

Process finished with exit code 0
  1. 实现runnable接口
    因为继承的局限性,所以我们一般不会去用继承Thread类的方式去实现多线程,我们初级阶段用到的最多的是实现runnable接口,重写run方法,通过Thread调用start方法,进行线程的启动。
package cn.com.dh;

public class MyThreadR implements Runnable {
    @Override
    public void run() {
        for(int i = 0; i < 30; i++){
            System.out.println("第 "+i+" 次执行"+Thread.currentThread().getName());
        }
    }

    public static void main(String[] args) {
        MyThreadR myThreadR1 = new MyThreadR();
        MyThreadR myThreadR2 = new MyThreadR();
        Thread thread1 = new Thread(myThreadR1);
        Thread thread2 = new Thread(myThreadR2,"t2");
        thread1.start();
        thread2.start();
    }
}

Console打印输出

第 0 次执行Thread-0
第 1 次执行Thread-0
第 2 次执行Thread-0
第 3 次执行Thread-0
第 4 次执行Thread-0
第 5 次执行Thread-0
第 6 次执行Thread-0
第 7 次执行Thread-0
第 8 次执行Thread-0
第 9 次执行Thread-0
第 10 次执行Thread-0
第 11 次执行Thread-0
第 12 次执行Thread-0
第 13 次执行Thread-0
第 14 次执行Thread-0
第 0 次执行t2
第 15 次执行Thread-0
第 1 次执行t2
第 16 次执行Thread-0
第 2 次执行t2
第 17 次执行Thread-0
第 3 次执行t2
第 18 次执行Thread-0
第 4 次执行t2
第 19 次执行Thread-0
第 5 次执行t2
第 20 次执行Thread-0
第 6 次执行t2
第 21 次执行Thread-0
第 7 次执行t2
第 22 次执行Thread-0
第 8 次执行t2
第 23 次执行Thread-0
第 9 次执行t2
第 24 次执行Thread-0
第 10 次执行t2
第 25 次执行Thread-0
第 11 次执行t2
第 26 次执行Thread-0
第 12 次执行t2
第 27 次执行Thread-0
第 13 次执行t2
第 28 次执行Thread-0
第 14 次执行t2
第 29 次执行Thread-0
第 15 次执行t2
第 16 次执行t2
第 17 次执行t2
第 18 次执行t2
第 19 次执行t2
第 20 次执行t2
第 21 次执行t2
第 22 次执行t2
第 23 次执行t2
第 24 次执行t2
第 25 次执行t2
第 26 次执行t2
第 27 次执行t2
第 28 次执行t2
第 29 次执行t2
  1. 实现callable接口
    此种方式于与之前的两张方式最大的不同在于,实现callable接口可以有返回值和抛出异常
    需要借助服务,线程池和future类
package cn.com.dh;

import java.util.concurrent.*;

public class MyThreadC implements Callable<String> {
private String threadName;
    @Override
    public String call() throws Exception {

        for(int i = 0; i < 20; i ++){
            threadName = "第 " + i +" 次执行,"+ Thread.currentThread().getName();
            System.out.println(threadName);
        }
        return threadName;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建实现类对象
        MyThreadC myThreadC1 = new MyThreadC();
        MyThreadC myThreadC2= new MyThreadC();
        // 创建执行服务
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        // 提交执行
        Future<String> future1 = executorService.submit(myThreadC1);
        Future<String> future2 = executorService.submit(myThreadC2);
        // 获取结果
        String res1 = future1.get();
        String res2 = future2.get();
        // 关闭服务
        executorService.shutdown();
    }
}

Console打印输出:

第 0 次执行,pool-1-thread-2
第 0 次执行,pool-1-thread-1
第 1 次执行,pool-1-thread-1
第 1 次执行,pool-1-thread-2
第 2 次执行,pool-1-thread-1
第 2 次执行,pool-1-thread-2
第 3 次执行,pool-1-thread-1
第 3 次执行,pool-1-thread-2
第 4 次执行,pool-1-thread-2
第 5 次执行,pool-1-thread-2
第 6 次执行,pool-1-thread-2
第 7 次执行,pool-1-thread-2
第 8 次执行,pool-1-thread-2
第 9 次执行,pool-1-thread-2
第 10 次执行,pool-1-thread-2
第 11 次执行,pool-1-thread-2
第 4 次执行,pool-1-thread-1
第 12 次执行,pool-1-thread-2
第 5 次执行,pool-1-thread-1
第 13 次执行,pool-1-thread-2
第 6 次执行,pool-1-thread-1
第 14 次执行,pool-1-thread-2
第 7 次执行,pool-1-thread-1
第 15 次执行,pool-1-thread-2
第 8 次执行,pool-1-thread-1
第 16 次执行,pool-1-thread-2
第 9 次执行,pool-1-thread-1
第 17 次执行,pool-1-thread-2
第 10 次执行,pool-1-thread-1
第 18 次执行,pool-1-thread-2
第 19 次执行,pool-1-thread-2
第 11 次执行,pool-1-thread-1
第 12 次执行,pool-1-thread-1
第 13 次执行,pool-1-thread-1
第 14 次执行,pool-1-thread-1
第 15 次执行,pool-1-thread-1
第 16 次执行,pool-1-thread-1
第 17 次执行,pool-1-thread-1
第 18 次执行,pool-1-thread-1
第 19 次执行,pool-1-thread-1

Process finished with exit code 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章