周四的时候老师讲了java多线程,留了作业题,以这道作业题为基础, 小结多线程,也参考了很多网友的博客,参考链接见下文。可能有不对的地方,欢迎指错O(∩_∩)O~~
线程,进程基本概念
-
- 进程是静态的 是一个镜像,线程是动态的 一个程序在运行的时候会先开辟线程然后执行里面的方法 开辟更多的新线程 ,而进程则是操作系统用来给用户进行展现程序运行的一种机制。
- 所以说在实际开发中不管是java还是其他语言 都是只存在线程的。
实现多线程的两种方法
- a. 让这个类继承java.lang.Thread,然后重写run方法
- b. 让这个类实现 java.lang.Runnable接口,实现run方法
- 注意:start(),启动该线程,使该线程开始执行,Java虚拟机调用该线程的run( )方法
Runnable和Callable
- (1)Callable规定的方法是call(),Runnable规定的方法是run()
- (2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
- (3)call方法可以抛出异常,run方法不可以
- (4)运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
小车过隧道问题
- 有一条隧道,同时只允许一辆车通行,隧道两端各有多辆车等待通行,车辆只能等到隧道处于空闲状态时才能被运行进入隧道,一旦隧道中已有车辆则禁止其他车辆进入。
- 分析:题目中隧道为共享变量,隧道左边的车过隧道为一个线程,右边的车过隧道为另外一个线程,一辆车进入时,另外一辆车则不能进入,对共享变量“隧道的访问具有互斥性
- 可以这样设计代码,将Runnable对象作为某一个类的内部类,共享的数据“隧道”作为外部类的成员变量,对共享数据的操作分配给外部类的方法来完成,以此实现对操作共享数据的互斥和通信,作为内部类的Runnable来操作外部类的方法,实现对数据的操作。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class
ShareData
{
private
int
isCarInTunnel
=
0
;
private
int
leftCar
=
0
;
private
int
rightCar
=
0
;
public
void
getSignal
(
int
signal
)
{
|