Java线程的全方位概述,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
线程是进程的一部分,是程序执行中的一条执行路线;
进程就是指程序在其自身地址空间的一次执行活动,是程序独立运行的基本单位;
一个进程可以包含多条线程,一个条线程对应一个进程中的一条执行路线。
主要由四种方式创建线程:
方式1:继承Thread类,重写run(),无返回值
方式2:实现Runnable接口,重写run(),无返回值
方式3:新建FutureTask + 实现Callable接口,重写call(),有返回值
方式4:通过Executors工具类创建线程池 + 调用submit + 重写Callable接口,重写call(),有返回值
具体每一种创建方式说明及代码实现如下:
/** * 创建Thread线程的四种方式之内部类写法 */ public class NewThread { public static void main(String[] args) throws Exception { //方式1 Thread t1 = new Thread(){ @Override public void run() { System.out.println("方式1:继承Thread类并重写run()方法创建线程,无返回值"); } }; t1.start(); Thread.sleep(1000); //方式2 Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("方式2:实现Runnable接口并重写run()方法创建线程,无返回值"); } }); t2.start(); Thread.sleep(1000); //方式3 FutureTask<String> ft = new FutureTask<>(new Callable<String>() { @Override public String call() throws Exception { String result = "方式3:实现Callable接口并重写call()方法新建FutureTask对象作为new Thread实例化参数创建线程,有返回值"; return result; } }); Thread t3 = new Thread(ft); t3.start(); System.out.println(ft.get()); //输出返回值 Thread.sleep(1000); //方式4 ExecutorService pool = Executors.newFixedThreadPool(5); Future<String> future = pool.submit(new Callable<String>(){ @Override public String call() throws Exception { String result = "方式4:通过工具类Executors创建线程池,调用submit新建Future对象并重写Callable接口重写call()方法创建线程,有返回值"; return result; } }); pool.shutdown();//关闭线程池 System.out.println(future.get()); //输出返回值 } }
新建(new):通过上面介绍的某种方式新建线程即处于新建状态;
就绪(Ready):调用线程的start()方法,首先进入就绪状态,等待获取CPU时间;
运行(Running):就绪状态的线程获取到CPU时间或阻塞状态的线程恢复都可进入运行状态;
阻塞(Blocked):运行状态的线程可能因为IO阻塞或在synchronized同步代码块中都可进入阻塞状态;
死亡(Dead):正常运行的线程执行结束或就绪状态的线程直接调用stop()方法就会进入死亡状态;
睡眠(Sleeping):调用sleep方法指定线程睡眠多久,会释放CPU资源,但不释放锁资源,睡眠时间到后会重新进入就绪状态;
等待(Waiting):调用wait会让线程短暂的处于等待中,会释放CPU资源,并且释放锁资源,进入就绪状态。
start:调用start()方法底层源码会判断线程状态是否是新建状态,不是则直接抛异常,并且后续会调用一个native本地方法start0,其底层通过JVM来进行调度最后调用run()方法执行;
run:调用run()方法,底层会直接进入到重写的run()方法并执行代码块内容;
sleep:属于Thread类的一个native本地static静态方法,可以在任何地方调用sleep(1000)方法,期间会让当前线程进入睡眠状态1秒钟,并让出CPU资源,但不释放锁资源
wait:属于Object类的一个方法,只能在synchronized同步块中进行调用wait(1000)方法,期间会让当前线程进入等待状态1秒钟,不仅会让出CPU时间,还释放并释放对象锁资源
yield:跟sleep一样,也是Thread类的一个native本地static静态方法,与sleep的最大区别在于Thread.yield()不需要指定暂停时间,并不会阻塞线程,而是进入就绪状态,短暂的让出CPU资源,这份CPU资源可能自己会再次获取到,这个取决于调度器;
notify:同wait一样,也是属于Object类的一个方法,作用是可以将wait()后等待的线程进行单个唤醒,并进入Read就绪状态;
notifyAll:同notify一样,也是属于Object类的一个方法,作用将当前对象上的所有等待线程唤醒,并进入Read就绪状态;
stop:该方法已被废弃,不建议使用,该方法的作用是直接将线程结束,进入死亡状态;
interrupt:冲断线程,不保证线程进入死亡、就绪还是继续运行,不想stop可以直接冲断一个正在运行的线程。 What's up!不来个点赞支持一下,这手指是金子做的?
看完上述内容,你们掌握Java线程的全方位概述的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。