并发:在同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在多个CPU上同时执行
多线程的实现方式:
➀继承Thread类的方式进行实现
public class Demo {
public static void main(String[] args) {
/*
1、自己定义一个类继承Thread
2、重写run方法
3、创建子类的对象,并启动线程
*/
Mythread mt1=new Mythread();
Mythread mt2=new Mythread();
mt1.setName("线程1");
mt2.setName("线程2");
mt1.start();
mt2.start();
}
}
public class Mythread extends Thread{
//输入run即可
@Override
public void run() {
//书写线程要执行的代码
for (int i = 0; i < 5; i++) {
System.out.println(getName()+"多线程学习中...");
}
}
}
结果随机交替产生
➁实现Runnable接口的方式进行实现
public class Demo {
public static void main(String[] args) {
/*
1、自己定义一个类实现Runnable接口
2、重写run方法
3、创建自己的类的对象
4、创建一个Thread类的对象,并开启线程
*/
//表示多线程要执行的任务
MyRun mr=new MyRun();
//创建线程对象
Thread t1=new Thread(mr);
Thread t2=new Thread(mr);
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
public class MyRun implements Runnable{
@Override
public void run() {
//书写线程要执行的代码
for (int i = 0; i < 5; i++) {
//不能直接调用getName()方法
//获取到当前线程的对象
System.out.println(Thread.currentThread().getName()+"多线程学习中ooo");
}
}
}
结果随机交替产生
➂利用Callable接口和Future接口的方式进行实现
public class Demo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
/*
特点:可以获取到多线程运行的结果,因为前两种方法是void,没有返回值
1、创建一个类MyCallable实现Callable接口
2、重写call (有返回值,表示多线程运行的结果)
3、创建MyCallable的对象 (表示多线程要执行的任务)
4、创建FutureTask的对象 (作用管理多线程运行的结果)
5、创建Thread类的对象,并启动线程 (表示线程)
*/
MyCallable mc=new MyCallable();
FutureTask<Integer> ft=new FutureTask<>(mc);
Thread t=new Thread(ft);
t.start();
//获取多线程运行的结果
Integer integer = ft.get();
System.out.println(integer);
}
}
public class MyCallable implements Callable <Integer>{
@Override
public Integer call() throws Exception {
//求1-100的和
int sum=0;
for (int i = 1; i <=100; i++) {
sum=sum+i;
}
return sum;
}
}
三种实现方式对比: