《Java从入门到放弃》JavaSE入门篇:多线程(入门版)
学习多线程之前,我们先搞清楚,为什么要使用多线程?~~Look
这就是标准的多线程的使用场景。一个锅可以同时煮多个菜,同一时间能有多个人在锅里夹菜。
小结:多线程的目的,就是为了解决需要同时运行多个任务的场合。
按官方的说法,多线程帮助你写出CPU最大利用率的高效程序,因为空闲时间保持最低,这对Java运行的交互式的网络互连环境是至关重要的,例如:网络的数据传输速率远低于计算机的处理能力,在传统的单线程环境中,你的计算机必须花费大量的空闲时间来等待,多线程能够使你充分利用这些空闲时间。
与进程关联紧密的还有一个术语,叫进程。进程是指系统中正在运行的程序。一台电脑可以运行多个进程,一个进程又可以分为多个线程来运行。比如在电脑上可以同时玩吃鸡游戏、用QQ音乐听歌、再运行两个QQ聊天,同时再开一个直播平台赚点网费。
Java中实现线程有两种方式:
一、扩展java.lang.Thread类
二、实现java.lang.Runnable接口
Thread类包含几个重要方法,如下图:
注意:Java程序启动时,一个线程就立刻运行,它执行main方法,这个线程被称为主线程。所有线程都依赖该线程,如果关闭它
,其他所有子线程都会被关闭。
接下来写个做饭的例子吧。
[code]public class CookRiceThread extends Thread { @Override public void run() { try { System.out.println("开始煮饭..."); //为了节约时间,我们假设煮饭只需要11秒 Thread.sleep(11000); System.out.println("饭煮熟了!"); } catch (Exception e) { e.printStackTrace(); } } } public class CookThread extends Thread { @Override public void run() { try { //做5个菜,每个菜2.5秒做好 for (int i = 1; i <= 5; i++) { System.out.println("开始做第" + i + "个菜..."); Thread.sleep(2500); System.out.println("第" + i + "个菜做好了。"); } } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { CookThread cook = new CookThread(); cr.start(); cook.start(); }
运行结果如下:
当然,计算机的运行方式跟我们现实中吃火锅是有区别的。假如你的电脑是单CPU的,各个线程在运行时通过轮流获得CPU的使用权来执行各自的任务。所以线程需要通过优先级来区别谁先执行,优先级通过setPriority和getPriority方法来使用。线程的默认优先级是5.
下面的例子,我们通过实现接口的方式,来了解线程的优先级。
[code]//自定义线程,实现Runnable接口 class MyThread implements Runnable { public void run() { String strName = Thread.currentThread().getName(); System.out.println(); for (int i = 0; i < 10; i++) { System.out.print(strName + ":" + i+" "); } } } public static void main(String[] args) { //三个线程 Thread t1 = new Thread(new MyThread()); //第一个自定义线程 Thread t2 = new Thread(new MyThread()); //第二个自定义线程 Thread t3 = Thread.currentThread(); //获得当前线程,即主线程 t1.setName("t1"); t2.setName("t2"); t3.setName("t3"); t1.setPriority(Thread.MAX_PRIORITY); //设置线程的优先级 t2.setPriority(Thread.MIN_PRIORITY); System.out.println(t1.getName() + "的优先级:" + t1.getPriority()); System.out.println(t2.getName() + "的优先级:" + t2.getPriority()); System.out.println(t3.getName() + "的优先级:" + t3.getPriority()); t1.start(); t2.start(); String strName = t3.getName(); System.out.println(); for (int i = 0; i < 10; i++) { System.out.print(strName + ":" + i+" "); } }
根据电脑不同,运行的结果会有所区别:
最后对线程状态简单介绍,毕竟入门级水平基本不用管太多多线程,等以后碰到的时候再来好好研究吧。
- 新建状态(New):使用new关键字创建线程对象,仅仅被分配了内存;
- 就绪状态(Ready):线程对象被创建后,等待它的start方法被调用,以获得CPU的使用权;
- 运行状态(Running):执行run方法,此时的线程的对象正占用CPU;
- 睡眠状态(Sleeping):调用sleep方法,线程被暂停,睡眠时间结束后,线程回到就绪状态,睡眠状态的线程不占用CPU;
- 死亡状态(Dead):run方法执行完毕后,线程进入死亡状态;
- 阻塞状态(Blocked):线程由于某些事件(如等待键盘输入)放弃CPU,暂停运行,直到线程重新进入就绪状态,才有机会转到运行状态;
多线程入门级内容到这儿就结果了,如果觉得意犹未尽,那就·································自行百度吧,哈哈!
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)
- 《Java从入门到放弃》JavaSE入门篇:异常
- 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)
- 《Java从入门到放弃》JavaSE入门篇:程序结构 推荐
- 《Java从入门到放弃》JavaSE入门篇:JDBC(入门版)
- 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法一(入门版)
- 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)
- 《Java从入门到放弃》JavaSE入门篇:变量
- 《Java从入门到放弃》JavaSE入门篇:JDBC(入门版)
- 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)
- 《Java从入门到放弃》JavaSE入门篇:集合
- 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)
- 《Java从入门到放弃》JavaSE入门篇:集合
- 《Java从入门到放弃》JavaSE入门篇:数组
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法一(入门版)
- 《Java从入门到放弃》JavaSE入门篇:面向对象语法一(入门版)
- 《Java从入门到放弃》JavaSE入门篇:异常
- 《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)