文章目录
java 中实现多线程有四种方式
- 继承 Thread 类
- 实现 Runnable 接口
- 使用 FutureTask
- 使用 Executor 框架
单线程实现单词抄写
1、Punishment.java
存储要抄写的单词,以及剩余的抄写次数。主要代码如下:
public class Punishment {
private int leftCopyCount;
private String wordToCopy;
public Punishment(int leftCopyCount, String wordToCopy) {
this.leftCopyCount = leftCopyCount;
this.wordToCopy = wordToCopy;
}
public int getLeftCopyCount() {
return leftCopyCount;
}
public void setLeftCopyCount(int leftCopyCount) {
this.leftCopyCount = leftCopyCount;
}
public String getWordToCopy() {
return wordToCopy;
}
public void setWordToCopy(String wordToCopy) {
this.wordToCopy = wordToCopy;
}
}
2、Student.java
持有 Punishment 的引用。实现了抄写单词的 copyWord 方法。主要代码如下:
public class Student {
private String name;
private Punishment punishment;
public Student(String name,Punishment punishment) {
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 + "次!");
}
}
public class StudentClient {
public static void main(String[] args) {
Punishment punishment = new Punishment(100,"internationalization");
Student student = new Student("小明",punishment);
student.copyWord();
}
}
输出如下:
main线程-小明抄写internationalization。还要抄写99次
…(中间省略)
main线程-小明抄写internationalization。还要抄写0次
main线程-小明一共抄写了100次!
继承thread实现独立线程单词抄写
//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完成任务
@Override
public void run() {
copyWord();
}
}
public class StudentClient {
public static void main(String[] args) {
Punishment punishment = new Punishment(100,"internationalization");
Student student = new Student("小明",punishment);
student.start();
}
}
可以看到此时调用的不是 student 的 copyWord 方法,而是调用了 start 方法。start 方法是从 Thread 类继承而来,调用后线程进入就绪状态,等待 CPU 的调用。而 start 方法最终会触发执行 run 方法,在 run 方法中 copyWord 被执行。输出如下:
小明线程-小明抄写internationalization。还要抄写99次
…(中间省略)
小明线程-小明抄写internationalization。还要抄写0次
小明线程-小明一共抄写了100次!
实现runnable接口,启用单独线程抄写单词
public class Student implements Runnable{
private String name;
private Punishment punishment;
public Student(String name, Punishment punishment) {
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 + "次!");
}
//重写run方法,完成任务。
@Override
public void run(){
copyWord();
}
}
public class StudentClient {
public static void main(String[] args) {
Punishment punishment = new Punishment(100,"internationalization");
Thread xiaoming = new Thread(new Student("小明",punishment),"小明");
xiaoming.start();
}
}