通俗理解多线程
生活小例子:通俗的来理解多线程其实就相当于你一边听歌一边写作业这种行为。但是人的大脑只有一个(不是多核)因此本质上是上一秒你在听歌下一秒你在写作业但是你会认为自己是在边听歌边写作业,本质上是两个任务被你的大脑依次调度。
进程程序和线程:因为你写了程序需要运行所以cpu需要给你分配一定的空间(创造了进程),而线程是寄生在进程之中的事情,一个进程可以有多个线程,及时什么都不做依然有原始得线程,例如:main线程(主线程),如果你学过java你还可以知道gc线程(负责垃圾回收)。俗话说的好,人间一天计算机十年(人间以秒来计算,计算机用纳秒来计算),多线程并发就是多个线程在一个cpu的调度算法下来回切换(因为单核cpu同一时间只能执行一个任务)
线程创建
方式
1.继承Thread类:
继承之后需要重写run方法,该方法就是线程体以及要执行的内容,当要执行该线程时可调用start方法,当执行次数过多时可以从结果看出线程的并发是交替的,具体次序由cpu决定。
public class TestThread extends Thread{
@Override
public void run() {
//线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码"+i);
}
}
public static void main(String[] args) {
TestThread t = new TestThread();
t.start();
//主线程
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程"+i);
}
}
}
2.实现Runnable接口:
方式2 实现runnable接口,重写run,执行线程需要丢入runnable接口实现类,调用start
@Override
public void run() {
//线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码"+i);
}
}
public static void main(String[] args) {
//创建runnable接口得实现类对象
TestThread3 t3 = new TestThread3();
//创建线程对象,通过线程对象来开启我们的线程,代理
Thread t = new Thread(t3);
t.start();
//主线程
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程"+i);
}
}
多线程小实例程序----买票
public class TestThread4 implements Runnable{
//票数
private int ticketNum = 10;
@Override
public void run() {
while (true){
if(ticketNum<=0){
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNum--+"张票");
}
}
public static void main(String[] args) {
TestThread4 thread4 = new TestThread4();
new Thread(thread4,"小明").start();
new Thread(thread4,"老师").start();
new Thread(thread4,"黄牛").start();
}
结果:黄牛拿到了第10张票
小明拿到了第9张票
老师拿到了第10张票
小明拿到了第7张票
黄牛拿到了第8张票
老师拿到了第6张票
黄牛拿到了第5张票
小明拿到了第5张票
老师拿到了第5张票
老师拿到了第4张票
黄牛拿到了第2张票
小明拿到了第3张票
老师拿到了第1张票
小明拿到了第0张票
静态代理(剖析Thread)
好处:被代理对象可以专注做一件事,代理人科一更方便的做更多的事情
以结婚为例子
我要结婚 我是真实角色
interface Marry{
void marry();
}
//我是真实执行的人
class you implements Marry{
@Override
public void marry