关于Java中的线程 为什么n=8 的时候会停止? 为什么不是left,right of left子线程一直执行下去。。。

当前位置: >
> 父线程 在创造了子线程后,是不是继续执行自己的代码 ?(收集整理)
父线程 在创造了子线程后,是不是继续执行自己的代码 ?(收集整理)
lionel_an & at
父线程 在创建了子线程后,是不是继续执行自己的代码 ?(收集整理)
  1.父线程必须在子线程结束后结束 因为子线程是属于父线程的父线程要是结束了它的所有子线程也就随之消亡!
  2..如果父线程先于子线程结束,那么子线程将在父线程结束的同时被迫结束。Thread.Join()方法使父线程等待,直到子线程结束。Abort()方法带来的后果是不可恢复的终止线程。
  3.起始线程可以称之为主线程,如果所有的前台线程都停止了,那么主线程可以终止,而所有的后台线程都将无条件终止。后台线程跟前台线程只有一个区别,那就是后台线程不妨碍程序的终止。一旦一个进程所有的前台线程都终止后,CLR将通过调用任意一个存活中的后台进程的Abort()方法来彻底终止进程。
  5.挂起,睡眠(都可称为--阻塞,暂停)与Thread.Sleep 不同,Thread.Suspend 不会使线程立即停止执行。直到线程到达安全点之后它才可以将该线程挂起。如果线程尚未启动或已经停止,则它将不能挂起。调用 Thread.Resume 将使另一个线程跳出挂起状态并使该线程继续执行。一个线程不能对另一个线程调用Sleep ,但是一个线程可以对另一个线程调用Suspend。还可以使用许多其它的方式来阻塞线程。例如,可以通过调用 Thread.Join 使一个线程等待另一个线程(子线程)停止。使用Monitor.Wait使一个线程等待访问一个同步对象。
  6.关键字lock可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。多线程公用一个对象时,就不应该使用lock关键字了,这里Monitor,Monitor提供了使线程共享资源的方案。 Monitor类可以锁定一个对象,一个线程只有得到这把锁才可以对该对象进行操作。如:Monitor.Enter(obj); //现在oQueue对象只能被当前线程操纵了 Monitor.Exit(obj);
  7.一个进程开始时至少会有一个主线程 ( 即主执行实例 ) ,这是在系统加载你的程序的时候所创建的主执行流程。而消息队列则是与线程 ( Thread ) 相关的,在似win2k上一个线程有一个且只有一个消息队列 ( queue ) 与之相对应。消息队列是在什么时候生成的呢? 在似win2k系统上,从一开始创建线程就已经有了。一个线程可以创建多个窗体。统发送给这些窗口的消息都统一发送到同一个 消息队列 中,幸亏消息结构中有msg.hwnd指出该条消息与哪一个窗口相关, DispatchMessage() 函数就是依照这个保证消息分派处理自动化而且不会出错!
  8.每个窗体都属于创建它的线程,在一线程中直接访或间接问其它线程中的窗体的方法将导致运行时错误(VS2005)。解决方法:使用窗体从Control继承而来的Control.Invoke(Delegate)方法。该方法将在创建窗体的线程上执行委托指向的方法。注意:在VS2003下,可以在一个线程中直接或间接调用另一个线程中的窗体的方法,而不会导致运行时错误。
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-子线程中for循环影响主线程运行,如何解决
[问题点数:100分,结帖人shicheng929]
子线程中for循环影响主线程运行,如何解决
[问题点数:100分,结帖人shicheng929]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2012年2月 挨踢职涯大版内专家分月排行榜第三2011年11月 挨踢职涯大版内专家分月排行榜第三2011年10月 挨踢职涯大版内专家分月排行榜第三
2012年2月 挨踢职涯大版内专家分月排行榜第三2011年11月 挨踢职涯大版内专家分月排行榜第三2011年10月 挨踢职涯大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。trackbacks-0
这么来看待这个问题。首先明确线程代码的边界。其实很简单,Runnable接口的run方法所界定的边界就可以看作是线程代码的边界。Runnable接口中run方法原型如下: &
& & & & & public & void & run(); &
& 而所有的具体线程都实现这个方法,所以这里就明确了一点,线程代码不能抛出任何checked异常。所有的线程中的checked异常都只能被线程本身消化掉。:) & 这样本身也是符合线程的设计理念的,线程本身就是被看作独立的执行片断,它应该对自己负责,所以由它来消化所有的checked异常是很正常的。 &
& 这样就回答了楼主的第一个问题:checked异常一定要在线程内部消化。 &
& 但是,线程代码中是可以抛出错误(Error)和运行级别异常(RuntimeException)的。Error俺们可以忽略,因为通常Error是应该留给vm的,而RuntimeException确是比较正常的,如果在运行过程中满足了某种条件导致线程必须中断,可以选择使用抛出运行级别异常来处理,如下: &
& & & & & public & void & run() & { &
& & & & & & & & if & (...) & throw & new & RuntimeException(); &
& & & & & } &
& 当线程代码抛出运行级别异常之后,线程会中断。:)这点java中解释得很清楚: &
& && & @see & Thread &
& All & threads & that & are & not & daemon & threads & have & died, & either & by & returning & from & the & call & to & the & run & method & or & "by & throwing & an & exception & that & propagates & beyond & the & run & method". & &
& 但是对于invoke此线程的主线程会产生什么影响呢?主线程不受这个影响,不会处理这个RuntimeException,而且根本不能catch到这个异常。会继续执行自己的代码 & :) &
& 所以得到结论:线程方法的异常只能自己来处理。 &
& 关于最后一点,不相信的话大家可以做这么一个试验: &
& public & class & TestThreadException & extends & Thread & { &
& & & & & public & void & run() & { &
& & & & & & & & & throw & new & RuntimeException(); &
& & & & & } &
& & & & & public & static & void & main(String[] & args) & throws & InterruptedException & { &
& & & & & & & & & try & { &
& & & & & & & & & & & & & new & TestThreadException().start(); &
& & & & & & & & & } & catch(RuntimeException & ex) & { &
& & & & & & & & & & & & & // & 看看能不能到达这里? & :) &
& & & & & & & & & } &
& & & & & & & & & &
& & & & & & & & & Thread.sleep(1000); &
& & & & & & & & & // & 看看能不能到达这里? & :) &
& & & & & } &
记不得在哪里看到的代码,可以处理到线程中抛出的RuntimeException: &
& public & class & ApplicationLoader & extends & ThreadGroup &
& & & & & private & ApplicationLoader() &
& & & & & { &
& & & & & & & & & super("ApplicationLoader"); &
& & & & & } &
& & & & & public & static & void & main(String[] & args) &
& & & & & { &
& & & & & & & & & Runnable & appStarter & = & new & Runnable() &
& & & & & & & & & { &
& & & & & & & & & & & & & public & void & run() &
& & & & & & & & & & & & & { &
& & & & & & & & & & & & & & & & & //invoke & your & application & (i.e.MySystem.main(args) &
& & & & & & & & & & & & & & & & & throw & new & NullPointerException(); & //example, & throw & a & runtime & exception &
& & & & & & & & & & & & & } &
& & & & & & & & & }; &
& & & & & & & & & new & Thread(new & ApplicationLoader(), & appStarter).start(); &
& & & & & } &
& & & & & //We & overload & this & method & from & our & parent &
& & & & & //ThreadGroup & , & which & will & make & sure & that & it &
& & & & & //gets & called & when & it & needs & to & be. & & This & is & &
& & & & & //where & the & magic & occurs. &
& & & & & public & void & uncaughtException(Thread & thread, & Throwable & exception) &
& & & & & { &
& & & & & & & & & //Handle & the & error/exception. &
& & & & & & & & & //Typical & operations & might & be & displaying & a &
& & & & & & & & & //useful & dialog, & writing & to & an & event & log, & etc. &
& & & & & & & & & exception.printStackTrace();//example, & print & stack & trace &
& & & & & } &
呵呵,uncaughtException好像是唯一能够处理线程抛出的uncaught异常的入口。看来还是有细心人啊。确实如此,通过ThreadGroup的uncaughtException方法还是有处理的机会。当线程抛出uncaughtException的时候,JVM会调用ThreadGroup的此方法。默认的处理如下: &
& & & & & public & void & uncaughtException(Thread & t, & Throwable & e) & { &
& if & (parent & != & null) & { &
& & & & & parent.uncaughtException(t, & e); &
& } & else & if & (!(e & instanceof & ThreadDeath)) & { &
& & & & & e.printStackTrace(System.err); &
& & & & & } &
& 每个Thread都会有一个ThreadGroup对象,可以通过Thread.getThreadGroup()方法得到,提供了上述默认的uncaught异常处理方法。 &
& 上面没有提这点,因为俺认为在正常的情况下,这个方法的处理情况就已经足够了。还是那个线程设计的理念:“线程的问题应该线程自己本身来解决,而不要委托到外部。”通常情况下,外部不需要处理线程的异常。当然也有例外。:)&&
阅读(3858)
&re: Java中主线程如何捕获子线程抛出的异常
呵呵,JDK5之后Thread嵌套了一个uncaughtException接口,就是所用来处理这种情况.&&&&&&
阅读排行榜
评论排行榜JAVA中多线程执行的时间或是顺序的问题
JAVA中多线程执行的时间或是顺序的问题
为什么有时候在MIAN()方法执行完了,才开始执行子线程.而有时是MAIN()方法还没执行完,子线程就开始执行了.还有时是这个线程我已经让步了,却没有执行下一个线程,还是执行的这个线程.这要怎么解释?
补充:class MyRunner implements Runnable{&public void run(){&&for (int i = 0; i &10; i++) {&&&System.out.println(i);&&}&}}class MyThread extends Thread{&public void run(){&&for (int i = 11; i &20; i++) {&&&System.out.println(i);&&}&}}
public class FirestThreadTest {
&public static void main(String[] args) {&&System.out.println("主线程开始执行");&&Thread thread1=new Thread(new MyRunner());&&thread1.start();&&System.out.println("启动新行程1");&&Thread thread2=new MyThread();&&thread2.start();&&System.out.println("启动新行程2");&&System.out.println("主线程执行完毕");&&&}}
有时候有这样的执行结果:主线程开始执行启动新行程10123456789启动新行程2主线程执行完毕111213141516171819
主线程执行完了,线程2才开始
不区分大小写匿名
把你的代码贴出来看看
关于JAVA中多线程的问题:可以说是时间问题导致了程序运行后出现多种状况的原因..(现在只谈在一个CPU下运行JAVA程序的效果.)因为当START一个新的子线程后,MAIN方法中的程序执行到这时CPU开始切换,但是这种切换是随即的,跟时间有关,比如你第一次执行可能CPU在MAIN方法中执行到12345停了,然后执行子线程的11 12 13 14 15.。。一段时间后再切换回主线程。所以你看到程序的执行结果不一样。就是因为CPU切换线程(这时候应该叫进程吧)的时间不一样.。这虽然有顺序切换,但也不是你想的那样切回主1次再切回子1次这样来回切..而是0.001秒切一次可以这样比喻.
相关知识等待您来回答
编程领域专家

我要回帖

更多关于 excel left right 的文章

 

随机推荐