我有用于在Java中创建线程的此类
package org.vdzundza.forms;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class DrawThread extends Thread {
private static final int THREAD_SLEEP = 500;
public CustomShape shape;
private Graphics g;
public DrawThread(CustomShape shape, Graphics g) {
this.shape = shape;
this.g = g;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(THREAD_SLEEP);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(this.shape.getColor());
g2d.fill(this.shape.getShape());
System.out.println(String.format("execute thread: %s %s",
Thread.currentThread().getName(), this.getName()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
控制台显示以下文本作为输出
execute thread: red rectangle Thread-2
execute thread: yellow ellipse Thread-3
我的代码创建了新线程:
customShapes[0] = new CustomShape(
new Rectangle2D.Float(10, 10, 50, 50), Color.RED,
"red rectangle");
customShapes[1] = new CustomShape(new Ellipse2D.Float(70, 70, 50, 50),
Color.YELLOW, "yellow ellipse");
for (CustomShape cshape: customShapes) {
Thread t = new Thread(new DrawThread(cshape, this.getGraphics()),
cshape.getName());
threads.add(t);
t.start();
}
我的问题是:为什么Thread.currentThread().getName()
返回正确的线程名却this.getName()
返回另一个?
为什么要
Thread.currentThread().getName()
返回正确的线程名称而又this.getName()
返回其他?
您的DrawThread
课程,extends Thread
但随后您通过调用以下内容开始:
new Thread(new DrawThread(...));
这是不正确的。这意味着创建的线程实际是 不 一样Thread
的DrawThread
。 DrawThread
应该实现Runnable
而
不是 扩展线程。您的代码可以工作,因为线程也是可运行的。
public class DrawThread implements Runnable {
因为有两个线程对象,所以当您调用this.getName()
的DrawThread
对象不是实际运行的线程时,因此其名称设置不正确。仅设置包装线程的名称。在DrawThread
代码内部,应调用Thread.currentThread().getName()
以获取运行线程的真实名称。
最后,你的类也许应该是DrawRunnable
,如果它implements Runnable
。:-)
问题内容: 我需要一个解决方案来正确停止Java中的线程。 我有实现Runnable接口的类: 我有启动和停止线程的类: 但是当我关闭时,我在类中得到了异常: 我正在使用JDK 1.6。所以问题是: 如何停止线程并且不引发任何异常? PS我不想使用;方法,因为它已过时。 问题答案: 在类中,你需要一种设置标志的方法,该标志通知线程它将需要终止,类似于你刚刚在类范围中使用的变量。 当你希望停止线程时
问题内容: 如何查看Java进程中的线程数? 问题答案: 调试Java程序的有用工具,它提供了线程数和其他有关线程的信息:
我有一个耗时的任务,我想在用户输入“abort”时手动中止它。 可运行:
但这一个也不起作用。正确的答案是加入线程并删除2个睡眠: 我的问题是:为什么我的答案都不能被接受?我的实验室领导问,但他不能给我一个答案。在家里编写了测试代码,它似乎工作得很好。提前感谢您的帮助!
问题内容: 我在Java中使用A 来管理许多正在运行的线程。我创建了自己的简单名称,以便为线程命名。 问题在于,在首次创建线程池时会在线程中设置名称,并且该名称与线程池实际正在运行的任务无关。我了解这一点…尽管我的Runnable和Callables具有名称,但它们实际上是从的运行线程开始的抽象层。 关于为线程池创建名称,StackOverflow上还有其他一些问题。(请参阅如何为可调用线程命名?
我试图了解更多关于java线程转储的信息。我正在使用JBOSS EAP 4.3。 目前,我在我的一个环境中面临性能问题。突然,CPU利用率上升到700%。我把线程转储了,它是一个巨大的文件。 我在我的threaddump中发现了很多下面等待的线程条目。 我想从上面的等待线程中理解。是什么导致CPU利用率上升?