栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

多线程(三)——了解线程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多线程(三)——了解线程

目录

一、状态二、方法

2.1 start()2.2 run()2.3 yield()2.4 join() 三、状态与方法关系图

一、状态

线程共有6个状态。

状态名称
new(新建状态)用new创建的线程处于新建状态,此时他和其他的Java对象一样,仅仅在堆中分配了内存,没有调用start方法。
runable(就绪状态)调用start方法,线程处于就绪状态
blocked(阻塞状态)因为某些原因放弃CPU(缺少资源:IO、锁),暂时停止运行,进入阻塞状态
waiting(等待状态)线程中的对象的调用wait()时,JVM就会将线程放入到等待池中
timed_waiting(睡眠状态)在指定的等待时间内等待线程的状态
terminated(终止状态)线程已经执行完毕

源码如下:

public enum State {
        
        NEW,

        
        RUNNABLE,

        
        BLOCKED,

        
        WAITING,

        
        TIMED_WAITING,

        
        TERMINATED;
    }
    正常的线程只有四个状态:新建状态(NEW)、RUNNABLE(就绪状态)、终止状态(TERMINATED)。非正常状态:阻塞状态(BLOCKED)、等待状态(WAITING)、睡眠状态(TIME WAITING)
二、方法 2.1 start()

启动操作系统的线程,进入就绪队列,等待CPU分配时间片,获取到时间片后执行线程的run方法。(start()只能执行一次)

源码如下:

    public synchronized void start() {
        
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                
            }
        }
    }
2.2 run()

业务逻辑的实现方法。

    直接调用run方法不会启动线程调用start方法以后,JVM会自动的运行run方法

源码如下:

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
2.3 yield()

将运行中的线程便会就绪状态,让出cpu的执行权,并通知操作系统从就绪线程中选出线程运行(可选择原来执行yield的线程)

注意:不释放资源

源码如下:

    public static native void yield();
2.4 join()

当有新的线程加入时,主线程会进入等待(waiting)状态,一直到调用join()方法的线程执行结束为止。

当不调用join方法时,等到主线程执行完,才执行其他线程。

Runnable runnable = new RunnableDemo(){
    @Override
    public void run() {
        System.out.println("执行中....");
    }
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
System.out.println("执行完毕");

执行结果:

执行完毕
执行中....
执行中....

调用join方法时,先执行指定线程

Runnable runnable = new RunnableDemo(){
  @Override
    public void run() {
        System.out.println("执行中....");
    }
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();

try{
    t1.join();
    t2.join();
}catch (Exception e){
    e.printStackTrace();
}
System.out.println("执行完毕");

执行结果:

执行中....
执行中....
执行完毕
三、状态与方法关系图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/759653.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号