Java核心技术之多线程的实现

Bonnie ·
更新时间:2024-09-21
· 908 次阅读

Java实现多线程的四种方式

1、继承Thread类
2、实现Runnable接口
3、使用Future Task
4、使用Executor框架

继承Thread类和实现Runnable接口是最基本的方式,但有一个共同的缺点:没有返回值。而Future Task解决了这个问题。Executor是JDK提供的一个多线程框架。

Java8创建一个新的执行线程有两种方法:
1、一种是将一个类声明为Thread的子类。这个子类应该重写run 类的方法Thread。然后可以分配并启动子类的实例。
2、另一种创建一个线程是声明实现类Runnable接口。那个类然后实现了run方法。然后可以分配类的实例,在创建Thread时作为参数传递,并启动。
注意:使用继承Thread类创建线程,最大的局限就是不能多继承,所以为了支持多继承,可以采用实现Runnable接口的方式。

继承Thread类实现独立线程单词抄写

模拟一个业务场景:
在这里插入图片描述
先来看第一种实现方式:继承Thread类,重写run方法的方式。
下面通过程序来模拟小明抄写单词的任务。小编觉得抄写次数100有点多,为了减轻小明的工作量,下面代码用的都是抄写10次。
1、定义Punishment.java类,存储要抄写的单词,以及剩余抄写次数。

package com.JavaCoding.ManyThread; import lombok.Data; @Data public class Punishment { private int leftCopyCount; private String wordToCopy; public Punishment(int leftCopyCount, String wordToCopy) { this.leftCopyCount = leftCopyCount; //剩余抄写次数 this.wordToCopy = wordToCopy; //要抄写的单词 } }

2、定义Student.java类,引用Punishment,实现抄写单词的copyWord方法。

package com.JavaCoding.ManyThread_Thread; import com.JavaCoding.ManyThread.Punishment; //1、继承Thread类 public class Student extends Thread { private String name; private Punishment punishment; public Student(String name, Punishment punishment) { //2、调用Thread构造方法,设置threadname super(name); this.name = name; this.punishment = punishment; } public void copyWord(){ int count=0; String threadName=Thread.currentThread().getName(); while (true){ if(punishment.getLeftCopyCount()>0){ int leftCopyCount=punishment.getLeftCopyCount(); System.out.println(threadName+"线程-"+name+"抄写"+punishment.getWordToCopy()+"。还要抄写"+--leftCopyCount+"次"); punishment.setLeftCopyCount(leftCopyCount); count++; }else { break; } } System.out.println(threadName+"线程-"+name+"一共抄写了"+count+"次!"); } //3、重写run方法,调用copyWord public void run(){ copyWord(); } }

其中Student构造函数传入Punishment,copyWord方法是根据惩罚内容,完成单词抄写的主要逻辑。
copyWord方法中,count变量是计数器,记录抄写的总次数。threadName是本线程的名称,这里通过Thread的静态方法currentThread取得当前线程,然后通过getName方法获取线程名称。
While循环中,当punishment的剩余抄写次数大于0时,执行抄写逻辑,否则抄写任务完成,跳出循环。
3、通过main方法运行,查看运行效果。

package com.JavaCoding.ManyThread_Thread; import com.JavaCoding.ManyThread.Punishment; public class StudentClient { public static void main(String[] args) { Punishment punishment=new Punishment(10,"internationalization"); Student student=new Student("小明",punishment); student.start(); System.out.println("Another thread will finish the punishment.main thread is finished"); } }

start方法是从Thread类继承而来,调用后线程进入就绪状态,等待CPU的调用。而start方法最终会触发执行run方法,在run方法中copyWord被执行。

运行之后的结果显示为:
原创文章 203获赞 255访问量 11万+ 关注 他的留言板 展开阅读全文
作者:温娉哲



多线程 线程 java核心技术 JAVA

需要 登录 后方可回复, 如果你还没有账号请 注册新账号