您的位置:首页 > 编程语言 > Java开发

《Java从入门到放弃》JavaSE入门篇:多线程(入门版)

2019-03-21 11:32 351 查看
版权声明:©著作权归作者所有:来自CSDN博客作者十方上下的原创作品,如需转载,请注明出处,否则将追究法律责任 https://blog.csdn.net/xy229935/article/details/88708190

学习多线程之前,我们先搞清楚,为什么要使用多线程?~~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+" ");
}
}

根据电脑不同,运行的结果会有所区别:

最后对线程状态简单介绍,毕竟入门级水平基本不用管太多多线程,等以后碰到的时候再来好好研究吧。

  1. 新建状态(New):使用new关键字创建线程对象,仅仅被分配了内存;
  2. 就绪状态(Ready):线程对象被创建后,等待它的start方法被调用,以获得CPU的使用权;
  3. 运行状态(Running):执行run方法,此时的线程的对象正占用CPU;
  4. 睡眠状态(Sleeping):调用sleep方法,线程被暂停,睡眠时间结束后,线程回到就绪状态,睡眠状态的线程不占用CPU;
  5. 死亡状态(Dead):run方法执行完毕后,线程进入死亡状态;
  6. 阻塞状态(Blocked):线程由于某些事件(如等待键盘输入)放弃CPU,暂停运行,直到线程重新进入就绪状态,才有机会转到运行状态;

 

多线程入门级内容到这儿就结果了,如果觉得意犹未尽,那就·································自行百度吧,哈哈!

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: