一些概念性内容:
①进程和线程:进程代表一个软件的运行;线程是进程中的实际运作单位,是软件中互相独立,可以同时运行的功能。
②并发和并行:单个CPU上交替执行指令为并发;多个指令在多个CPU上同时执行为并行。
多线程的实现:
①继承Thread类:重写run方法即可用start开启线程。
class Mythread extends Thread {//继承Thread类
public void run() {//重写run方法
/*在run方法里书写线程要执行的代码即可*/
for (int i = 0; i < 99; i++) {
System.out.println(getName() + "执行");
}
}
}
public class Main{
public static void main(String[] args){
Mythread t1 = new Mythread();
Mythread t2 = new Mythread();
t1.setName("线程1");
t2.setName("线程2");
t1.start();//start表示开启线程
t2.start();
}
}
运行结果:线程1、2交替执行。
代码相对简单,无法再继承其他类。而后两种可以再继承其他类。
②Runnable接口:重写run方法,分别创建Runnable和Thread两个对象开启线程。
class Myrun implements Runnable {//Runnable接口
public void run() {//重写run方法
/*在run方法里书写线程要执行的代码即可*/
for (int i = 0; i < 99; i++) {
System.out.println("执行");
}
}
}
public class Main{
public static void main(String[] args){
Myrun mr = new Myrun();//先创建Runnable对象
Thread t1 = new Thread(mr);//再创建Thread对象
t1.start();//start表示开启线程
}
}
总结:不用再继承Thread类,但要多创建一个对象。
③Callable接口和Future接口:重写call,分别创建Callable和Future、Thread对象。
import java.util.concurrent.Callable;//必须有这一句
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class MyCallable implements Callable<Integer> {//Callable接口
public Integer call() throws Exception {
/*在run方法里书写线程要执行的代码即可*/
int A = 1000;
return A;//该方法需要返回值
}
}
public class Main{
public static void main(String[] args) throws ExecutionException ,InterruptedException{
MyCallable mc = new MyCallable();//先创建Callable对象
FutureTask<Integer> ft = new FutureTask<>(mc);//再创建FutureTask对象
Thread t1 = new Thread(ft);
t1.start();//start表示开启线程
//获取线程运行结果
Integer result = ft.get();
System.out.println(result);
}
}
可以获取到多线程的结果。