线程基础和线程控制
一、线程基础
1.1进程和线程的区别?
- 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
- 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,而线程是共享进程中的数据、地址空间
- 线程之间的通信更方便,同一进程下线程共享全局变量、静态变量等数据,而进程之间通信需要以通信的方式(IPC)进行
- 多进程程序更加健壮,多线程程序只要有一个线程死掉,整个进程也会死掉,而一个进程死掉并不会对另一个进程造成影响,因为进程有自己的独立空间
- 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低
1.2协程的相关概念?
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。从技术的角度来说,“协程就是你可以暂停执行的函数”。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
二、线程控制
2.1线程的创建
2.1.1显示集成Thread,重写run来指定线程执行代码
public class MyThread extends Thread {
@Override
public void run() {
for(int i=0; i<100; i++) {
System.out.println(i);
}
}
}
public class MyThreadDemo {
public static void main(String[] args) {
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法
my1.start();
my2.start();
}
}
2.1.2匿名内部类集成Thread,重写run来指定线程执行代码
// 构造方法的参数是给线程指定名字,推荐
Thread t1 = new Thread("t1") {
@Override
// run 方法内实现了要执行的任务
public void run() {
System.out.println("hello");
}
};
t1.start();
2.1.3显示实现Runnable接口,重写run方法
public class MyRunnable implements Runnable {
@Override
public void run() {
for(int i=0; i<100; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class MyRunnableDemo {
public static void main(String[] args) {
//创建MyRunnable类的对象
MyRunnable my = new MyRunnable();
//创建Thread类的对象,把MyRunnable对象作为构造方法的参数
Thread t1 = new Thread(my,"坦克");
Thread t2 = new Thread(my,"飞机");
//启动线程
t1.start();
t2.start();
}
}
2.1.4匿名内部类实现Runable接口,重写run方法
// 创建任务对象
Runnable task2 = new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();
2.1.5通过lambda表达式来描述线程执行代码
// 创建任务对象
Runnable task2 = () -> System.out.println("hello");
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();
- Thread的run和start之间的区别?
1.run:这是一个普通方法的调用没有创建新的线程. 输出语句实在原线程中执行的
2.start:这是要创建一个新的线程,由新的线程来执行输出
2.2线程相关方法介绍
2.3线程等待
- join : 线程A调用了线程B的join方法,此时A就阻塞,一致阻塞到B这个线程执行结束
- 存在的意义就是为了控制线程之间结束的先后顺序.
2.4线程休眠
- sleep: 线程A调用了sleep,A就阻塞了,阻塞到sleep时间到