java多线程的情况下如何进行调试?

java多线程的情况下如何进行调试?,第1张

默认情况下,在调试多线程程序时,当遇到断点时(breakpoint),当前线首塌程暂停,而其它线程继续运行侍芹散,有些情况下,这是我们不想要看到的。比如下面的例子:

除第21个线程以外,其余都是Running状态。

修改:

Window->Preferences->Java->Debug:

在红老氏色区域内,将默认的Suspend Thread 改为 Suspend VM

再调试多线程程序:

可以看到所有线程都Suspend了。

是这样子的呀,因为listBox1是Form1这个线程创建的,当然不能让其他的线程访问了。如果需要被其他的线程访问的化,需要使用委托。

举个例子:

//

先定义一个委托

public

delegate

void

SetTextCallback(string

text)

//

单击按悉搭钮

private

void

button1_Click(object

sender,

EventArgs

e)

{

Thread

t

=

new

Thread(new

ThreadStart(fun1))

t.Start()

}

//

线程函数体

private

void

fun1()

{

setText("hello")

}

//

设置文本函数

private

void

setText(string

text)

{

if

(label1.InvokeRequired)

{

SetTextCallback

s

=

new

SetTextCallback(setText)

Invoke(s,

new

string[]

{

text

})

}

else

{

label1.Text

=

text

}

}

窗体其实是窗体类的一个实例,当类实例了一个对象后,就相当与创建了一个线程,所以不能直接用其他的线程访问内部成员。

连分都没有还要求改代码,太过分了,你要嫌麻烦,就在构造函数里面加一句:

public

Form1()

{

InitializeComponent()

CheckForIllegalCrossThreadCalls

=

false

}

MSDN对CheckForIllegalCrossThreadCalls的解释:获取或设置一个值,该值指示是否捕获对错误线程的调用,这些调用在调试应用程序时访问控件

Handle

属性。

如果试图访问控件的方法或属性之一的线程不是创建该控件的线程,则通常会导致不可预知的睁郑拿结果。通常,无效的线程活动是对访问控件的

Handle

属性的错误线程的调用。将

CheckForIllegalCrossThreadCalls

设置为

true

可以在调试时更容易查找并诊断此线程活动。请注意在调试器外部启动应用程序时,非法跨线程调用将始终引发异常。丛知


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12518820.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存