java多线程运行机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程运行机制相关的知识,希望对你有一定的参考价值。

求解释:Java里是不是每个线程都有自己独立的运行空间(内存)?如果是这样,那吗mian进程出现错误之后,其他线程是不是完全不受影响呢?看下面的例子,如果我创建了更多的线程是不是每个线程都创建了自己的r对象呢,只有这样才能保证main线程出现错误其他线程还能打印num啊?如果是这样,那么同步锁是如何保证每个线程的锁用的是同一个对象呢?

public class Threadtest

public static void main(String[] args)

int[] arr=new int[3];
Run r=new Run();
Thread t=new Thread(r);
t.start();
System.out.println(arr[3]);





class Run implements Runnable

private int num=5;
public void run()

for(int i=0;i<100;i++)

System.out.println("i=......"+i+"..num="+num);


参考技术A 首先子线程不是独立的空间啊!要不也有同步锁了!
java中运行多线程时是一会运行这个线程,一会运行那个线程……随机运行的。因为运行的速度快时间短,所以就给人感觉线程是同时运行的。
只要出错了,java程序立马停止运行!追问

完全没解答到关键点啊

参考技术B 1、java的线程是用户级线程,在同一个进程内,没有独立的运行空间
2、如果出错,进程终止,所有的线程都没了
3、虽然每个线程都创建了自己的r对象,但不能保证main线程出现错误其他线程还能打印num,原因见上
4、用同一个对象还不容易,静态变量就可以追问

我上面写的程序main线程就出错了,但是子线程还在继续打印num,你没解答到关键点

追答

我说错了,主线程出错结束,子线程也不会结束。只有调用System.exit函数,退出虚拟机时,所有线程都会结束

本回答被提问者和网友采纳
参考技术C main进程是顶级父进程, 如果父进程结束了, 那么由父进程派生出的子进程与线程也都会结束追问

不对,java线程是相对独立的,你运行就知道了,我上面写的程序main线程就出错了,但是子线程还在继续,我说的是线程不是进程。。。。。

Java多线程系列---“基础篇”14之 wait,sleep,join,yield,park,unpark,notify等通信机制对比

1. 线程让步: yield()

yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

2. yield() 与 wait()的比较

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而yield()的作用是让步,它也会让当前线程离开“运行状态”。它们的区别是:
(1) wait()是让线程由“运行状态”进入到“等待(阻塞)状态”,而不yield()是让线程由“运行状态”进入到“就绪状态”。
(2) wait()是会线程释放它所持有对象的同步锁,而yield()方法不会释放锁。

3. 线程休眠:sleep()
sleep() 定义在Thread.java中。
sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

4. sleep() 与 wait()的比较:
我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”
但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。

5. sleep()与yield()的比较:

sleep和yield的区别在于, sleep可以使优先级低的线程得到执行的机会,  而yield只能使同优先级的线程有执行的机会.

6. Object中的wait()和notify()
使用注意事项:

  • 因为wait需释放锁,所以必须在synchronized中使用(没有锁时使用会抛出IllegalMonitorStateException)
  • notify也要在synchronized使用,并且应该指定对象
  • synchronized(),wait(),notify() 对象必须一致,一个synchronized()代码块中只能有1个线程wait()或notify()

7.LockSupport中的park() 和 unpark()

      总结一下,LockSupport比Object的wait/notify有两大优势:

   ①LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,实现了线程间的解耦。说明:park和wait的区别。wait让线程阻塞前,必须通过synchronized获

       取 同步锁。

   ②unpark函数可以先于park调用,所以不需要担心线程间的执行的先后顺序。

8.join

等待该线程终止。
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。

9.interrupt

 interrupt方法不会中断一个正在运行的线程.就是指线程如果正在运行的过程中, 去调用此方法是没有任何反应的. 为什么呢, 因为这个方法只是提供给 被阻塞的线程, 即当线程调用了.Object.wait, Thread.join, Thread.sleep三种方法之一的时候, 再调用interrupt方法, 才可以中断刚才的阻塞而继续去执行线程.

 









以上是关于java多线程运行机制的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程机制

JAVA多线程之中断机制(如何处理中断?)

Java高级-解析Java中的多线程机制

java 多线程5: java 终止线程及中断机制 (stop()interrupt() interrupted()isInterrupted())

JAVA多线程之中断机制(如何处理中断?)

Java多线程学习之线程的取消与中断机制