- 实现多线程
- 1.1进程
- 1.2线程
- 1.5线程调度
- 1.6线程控制
- 1.7线程生命周期
- 1.8多线程的实现方式
- 卖票案例分析
- 线程同步
- Lock锁
- 生产者消费者
实现多线程
1,进程
2,线程
3,多线程的实现方式
- 创建一个新的执行线程有两种方法。一个是将一个类声明为一个Thread的子类。这个子类应该重写run类的方法Thread 。
- 创建线程的另一种方法是声明一个实现Runnable接口的类。那个类然后实现了run方法。
在这里,如果直接使用 run()方法 就是顺序执行,是单线程。
我们可以从输出中看到,程序是先执行完了my1.run才执行的my2.run
我们可以改为start(),方法来启动多线程。
4,设置和获取线程的名称
有时候我们线程在运行的时候,我们并不懂它是哪个线程的。所以我们需要通过获取线程名称来知道线程的类型。
这样我们输出的值,就会显示是哪个线程的了
除了得到线程的名字之外,我们还可以设置线程的名字。
关于调用线程的名字,我们可以从上往下分析。
第一个方法赋值给第二个构造方法,第二个构造方法赋值给第三个构造方法
或者在这里,我们重写构造方法,给构造方法传入一个String类型的name变量。
这样参数就可以一步步传递到Thread类中。
线程调度
join()方法
如果有个线程调用了,join()方法,那么其他线程只有等待这个线程执行完毕,才会继续调用。
join()就是等线程结束之后才会开始其他的线程。
Daemon
在这里,main函数调用了Thread.currentThread(),说明只有Thread对象才能使用Thread类的方法。
刘备执行结束之后,关羽和张飞的线程也结束了。
线程生命周期
1.8实现多线程的方式____Runnable
给线程起名字
这里使用Runnable的接口的方法主要是为了,避免出现类继承了Thread无法继承其他类的情况。
卖票案例分析
注意,我们这里要添加:
sleep方法,让其他线程有时间去反应。
这里其实是三个线程共同调用同一个方法,修改同一个参数。tickets
线程同步
如果一个代码同时满足上面的三种语句,就会出现数据安全问题。
我们现在能够操作的只有第三种情况。——解决方法是给数据上锁
Lock锁
生产者消费者
生产者和消费者案例分析
与多线程有关的案例分析。
我们先写一个系统,该系统具有数据和操作数据的方法。
现在我们还需要其他的类,来调用该对象的一些方法。并且把这些方法以多线程的形式输出。
其中state是状态变量,我们通过建立一个state来标记状态指示符。根据不同的状态来判断代码块是否执行。
当我们使用wait()方法的时候,该代码块是需要被synchronized修饰的,只有同步的代码块才可以使用wait方法。
同时当我们等待了之后,我们也一定要记得唤醒程序的代码。