线程
线程是操作体统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
并发和并行
并发:在同一时刻,有多个指令在单个CPU上交替执行。
并行:在同一时刻,有多个指令在多个cpu上同时执行。
多线程的实现方式
- 继承Thread类的方式进行实现。
多线程的第一种启动方式:
1.自己定义一个继承Thread。
2.重写run方法。
3.创建子类的对象,并启动线程。
public class MyThread extends Thread{
public void run(){
for(int i = 0;i < 100 ;i++){
System.out.println(getName()+"HelloWorld");
}
}
//
public class ThreadDemo{
public static void main(String[] args){
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
- 实现Runnable接口的方式进行实现。
public class MyRun implements Runnable{
for(int i=0;i<100;i++){
Thread t = Thread.currentThread();
System.out.println(t.getName()+"Hello world");
}
}
public class ThreadDemo{
public static void main(String[] args){
// 多线程的第二种启动方式
1.自己定义一个类实现Runable接口
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();
}
}
- 利用Callable接口和Future接口的方式实现。
特点:可以获取到多线程运行的结果
1.创建一个类MyCallable实现Callable接口
2.重写call(是有返回值的,表示多线程运行的结果)
3.创建MyCallable的对象(表示多线程要执行的任务)
4.创建FutureTask的对象(作用管理多线程的运行结果)
5.创建Thread类的对象,并启动(表示线程)
// 创建 Callable 的对象(表示多线程要执行的任务)
MyCallable mc = new MyCallable();
// 创建FutureTask的对象
FutureTask<integer> ft = new FutureTask<>(mc);
// 创建线程的对象
Thread t1 = new Thread(ft);
// 启动线程
t1.start();
// 获取结果
int result = ft.get();
sout(result);// System...//
public class MyCallable implements Callable<Integer>{
public Integer call() throws Exception{
int sum = 0;
for(int i = 1;i<=100;i++){
sum = sum +i;}
return sum;
}
}
优缺点 :
优点 | 缺点 | |
继承Thread类 | 编程比较简单,可以直接使用Thread类中的方法 | 可以扩展性较差,不能在继承其他的类 |
实现Runnable接口 | 扩张性强,实现该接口的同时还可以继承其他的类 | 编程相对复杂,不能直接使用Thread类中的方法 |
实现Callable接口 | 扩张性强,实现该接口的同时还可以继承其他的类 | 编程相对复杂,不能直接使用Thread类中的方法 |