ZhaoJiu's Studio.

JAVA SE 10 多线程

字数统计: 1.2k阅读时长: 4 min
2019/04/21 Share

程序、线程和进程的区别是什么?

  • 程序:程序是一条指令的集合。程序不能独立执行,只有被加载到内存中,系统为它分配好资源后才能执行。
  • 进程:一个执行中的程序称为进程。进程是系统分配资源的独立单位,每个进程占有特定的地址空间。
  • 线程:是CPU调度和分配的基本单位,是比进程更小的独立运行的基本单位,也被称为轻量级的进程。
  • 线程不能独立存在,必须依附于某个进程。一个进程可以包括多个并发的线程,一个线程只属于一个进程,JVM允许应用程序并发执行多个线程。

java通过那些方法创建多线程?

  • 1 继承Thread类,重写run方法,创建多线程
  • 2 实现Runnable接口,实现run方法,创建多线程
  • Thread类也是实现了Runnable接口

当调用一个线程start方法的时候,线程马上进入运行状态吗?

不是,此时线程进入的是就绪(可运行)状态,等待分配cpu时间片。一旦得到cpu时间片,即进入到运行态。

sleep、yield、join方法的区别?

  • sleep(times):在指定的时间内让线程暂停执行,进入到阻塞状态。在指定的时间后到达就绪状态,调用sleep方法的时候,释放cpu不释放锁。(如果对象有锁的话)
  • yield():调用该方法后,线程暂停一下,回到就绪状态。所以调用该方法的线程很可能进入就绪状态马上又被执行。
  • join():当前线程等待调用此方法的线程执行结束后在继续执行。

为什么不推荐stop和destory方法来结束线程?

  • stop():stop方法时强制一个正在运行或是等待的线程关闭。但是stop方法不安全,就像切断电源关闭计算机一样。会产生不可预料的后果。而且强制中止的进程中的数据也可能对在多线程中其它的操作有所影响。
  • destory():该方法最初是用作破坏该线程,但不做任何资源的释放,它所保持的任何监视器都会保持锁定状态。不过,该方法绝不会被实现,即使实现,也极有可能以suspend()方式死锁。

synchronized修饰在方法前是什么意思?

一次只能有一个线程进入该方法,其它线程想要在此时调用该方法,只能排队等候。

什么是死锁?

过多的线程同步会引起死锁。如2个线程都在等待对方释放锁才能继续执行。

死锁代码:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public Class DeathBlock{
Object A = new Object();
Object B = new Object();
public void testEast(){
synchronized(A) {
synchronized(B) {
System.out.println("向东行驶...");
}
}
}
public void testWest() {
synchronized(B){
synchronized(A){
System.out.println("向西行驶...");
}
}
}
}


Class ToWestThread extends Thread {
DeathBlock deathBlock = new DeathBlock();
public ToWestThread(DeathBlock deathBlock) {
this.deathBlock = deathBlock;
}
public void run(){
d.testWest();
}
}

Class ToEastThread extends Thread {
DeathBlock deathBlock = new DeathBlock();
public ToEastThread(DeathBlock deathBlock) {
this.deathBlock = deathBlock;
}
public void run(){
d.testEast();
}

}

Class Test{
public static void public static void main(String[] args) {
DeathBlock deathBlock = new DeathBlock();
ToWestThread twt = new ToWestThread(deathBlock);
ToEastThread tet = new ToEastThread(deathBlock);
twt.start();
tet.start();
}
}

wait和sleep的区别?

  • wait():wait方法释放CPU,释放锁
  • sleep():sleep方法释放CPU,不释放锁

wait、notify、notifyAll方法。

  • 上述三个方法不属于Thread类,而是属于Object类,所以每个对象都有。因而每个对象都有锁,锁是每个对象的基础功能,上述3者是和锁有关的方法。
  • wait():导致当前对象陷入等待,进入阻塞状态,直到其它线程调用该对象的notify()或notifyAll()方法。当前线程必须拥有此对象监视器(对象锁)。 该线程释放对此线程的监视器并等待,直到其它方法调用notify或notifyAll通知此对象的监视器的线程醒来,然后该线程重新获得对监视器的所有权后才能继续执行。

  • notify():唤醒在此对象监视器(对象锁)上等待的单个线程,如果所有线程都在此对象上,则会选择性唤醒一条线程。直到当前线程放弃对此对象的锁定,才能继续执行被唤醒的线程。此方法只应由做为此对象监视器的所有者的线程来调用。

  • notifyAll():唤醒在此对象监视器上等待的所有线程。
CATALOG
  1. 1. 程序、线程和进程的区别是什么?
  2. 2. java通过那些方法创建多线程?
  3. 3. 当调用一个线程start方法的时候,线程马上进入运行状态吗?
  4. 4. sleep、yield、join方法的区别?
  5. 5. 为什么不推荐stop和destory方法来结束线程?
  6. 6. synchronized修饰在方法前是什么意思?
  7. 7. 什么是死锁?
  8. 8. 死锁代码:
  9. 9. wait和sleep的区别?
  10. 10. wait、notify、notifyAll方法。