多线程(一)
一、定义
线程:程序中执行的顺序流
多线程:多任务执行,多路径执行
多任务之间可以实现同步执行
二、优缺点
优点:提高效率,提高性能
缺点:设计更复杂,可能会造成数据不安全的问题
三、进程和线程
进程和线程的区别:
进程:资源分配的最小单元,每个进程都有自己的代码与数据空间(进程上下文),进程之间的切换资源消耗大
线程:cpu调度与执行的最小单位,一个进程至少包含1~n个线程,同一个进程的多个线程共享这个进程的代码数据空间,每个线程都有自己的运行栈与程序计数器,线程的切换消耗小
四、线程的创建方式
1.继承Thread类,重写run() + start()开启线程
2.实现Runnable接口,重写run() + start()开启线程
优点 :
接口多实现,类只能单继承
实现资源共享
3.实现juc包下Callable接口,重写call() + 线程池 --> 了解
五、如何创建线程
1、继承Thread类
package class0310Test;
public class Class0101Test extends Thread{
//重写run方法
public void run(){
for(int i=1;i<5;i++){
System.out.println("eat");
//由于输出执行的速度很快所以要让程序进入休眠才能看出效果
try {
//让该线程进入1毫秒的休眠
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
//创建主线程
//由于Class0101Test继承自Thread就是一个多线程类所以可以直接用
Class0101Test th = new Class0101Test();
//开启线程
//告诉CPU我们的线程可以被调用
th.start();
//按同样的方式写第二个线程来看结果
for (int i=1;i<5;i++){
System.out.println("drink");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2、实现Runnable接口
package class0310Test;
public class Class0102Test implements Runnable{
//推荐使用此方法因为只能单继承但是可以用接口多实现,且接口可以实现资源共享
//使用实现接口的方法时,一定会重写run()方法,不然会报错
public void run(){
for (int i=1;i<5;i++){
System.out.println("eat");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
//由于是实现所以得先创建一个Class0102Test类型的对象
//再把这个对象带入到新建的Thread类型对象中才能实现start方法开启线程
Class0102Test ct = new Class0102Test();
Thread th = new Thread(ct);
th.start();
for(int i=1;i<5;i++){
System.out.println("drink");
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}