【并发编程】线程创建和线程状态转换

目录

 

线程创建方式

线程状态转换

线程常用方法


线程创建方式

1.继承Thread类

2.实现Runnable接口

3.实现callable接口

callable  创建有返回值的线程

/**
 * @author zp
 * @Description: 创建可返回结果的线程
 * 继承Runnable接口 或者 实现thread类 实现run方法 线程执行完之后并没有返回值
 * @date 2018/9/21 下午2:29
 */
public class CallableTest {

    public static void main(String[] args) throws InterruptedException,ExecutionException{
        ExecutorService service = Executors.newSingleThreadExecutor();
        Future<String> task = service.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "callable返回值";
            }
        });

        System.out.println(task.get());
    }
}

 

线程状态转换

新建(NEW) : 线程被创建,还没有调用start()方法

就绪(RUNNABLE):  线程在等待运行(等待cpu 分配给时间片后方可运行)或者线程正在运行。有的说法是将就绪拆分成就绪和运行两种状态。等待运行时  ,线程位于可运行池中

阻塞(BLOCK): 当线程等待锁时,线程处于阻塞状态。阻塞状态的线程位于锁池。有的说法将线程调用sleep()方法后也成为阻塞状态

等待(WAITING) : 当线程调用wait()方法后线程变为等待状态,当一个线程被通知,如调用notify()方法后线程处于就绪状态。此时线程位于等待池。

超时等待: 进入条件和进入等待状态类似,但是调用的是超时等待的方法

消亡(DEAD): 当线程的run()方法执行完毕或者线程因为异常退出了run()方法。

 

线程状态流转图,此图来源于《JAVA并发编程的艺术》

 

线程常用方法

start()方法:线程类调用start()方法后,线程类才能作为线程去执行run()方法。如果不调用start()方法就调用run ()方法,线程会执行run()方法,但是不会以线程的方式去运行,仅仅相当于一个普通方法。

sleep()方法:Thread类的静态方法,让线程休眠指定的时间。调用sleep()方法的线程如果持有锁并不会放弃锁的所有权。线程不论是否持有锁都可以调用sleep()方法。

join()方法:让出当前资源等其他线程执行完再继续执行本线程 。这个方法比较难理解 ,比方在主线程A中,调用线程b 的 join()方法  ,可以理解为在主方法调用线程b 的join 方法  

public class JoinTest {


    public static void main(String[] args) throws InterruptedException {
        Thread b = new Thread(() -> {
            try {
                System.out.println("b线程开始睡眠");
                Thread.sleep(5000);
                System.out.println("b线程睡醒了");
            } catch (InterruptedException e) {

            }
        });
        b.start();
        b.join();
        System.out.println("b线程执行完后主线程执行了");
    }
}

控制台打印顺序是

b线程开始睡眠
b线程睡醒了
b线程执行完后主线程执行了 

Interrupt() 方法 ,中断线程。很多时候并不能直接中断线程 ,而是改变了一个线程标志位boolean 的值 。而中断操作是需要自己去实现的。一般实现方式,是根据中断标志的改变改结束执行线程。

 public static void main(String[] args) throws InterruptedException{
     Thread a = new Thread(()->{
        try {
            System.out.println("a线程开始睡眠");
            Thread.sleep(5000);
            System.out.println("a线程睡眠结束");
        }catch (InterruptedException e){
            System.out.println("a线程被中断");
            e.printStackTrace();
        }
     });

        a.start();
     Thread.sleep(100);
        System.out.println("主线程睡眠结束");
        a.interrupt();
    }

执行结果

a线程开始睡眠
主线程睡眠结束
java.lang.InterruptedException: sleep interrupted
a线程被中断
    at java.lang.Thread.sleep(Native Method)
    at com.example.demo.thread.InterruptTest.lambda$main$0(InterruptTest.java:14)
    at java.lang.Thread.run(Thread.java:748)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值