我有这个类用于在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()
又返回另一个?
答案 0 :(得分:46)
为什么
Thread.currentThread().getName()
会在this.getName()
返回其他名称时返回正确的帖子名称?
您的DrawThread
班级extends Thread
,但是您可以通过致电:
new Thread(new DrawThread(...));
这不正确。这意味着创建的实际线程不来自Thread
的{{1}}。 DrawThread
应该实现DrawThread
和不扩展线程。您的代码有效,因为Thread也是Runnable。
Runnable
因为有两个线程对象,当您在public class DrawThread implements Runnable {
对象上调用this.getName()
时,该对象不是实际运行的线程,因此其名称未正确设置。仅设置包装线程的名称。在DrawThread
代码中,您应该调用DrawThread
来获取正在运行的线程的真实名称。
最后,如果Thread.currentThread().getName()
,您的课程应该是DrawRunnable
。 : - )
答案 1 :(得分:8)
您正在将DrawThread
的实例传递给Thread(Runnable)
构造函数。它并不关心你的班级延伸Thread
;它只关心它implements Runnable
。
启动的线程是由new Thread(...)
创建的线程 - 您没有在该线程上设置名称。
一般来说,延长Thread
是不好的做法,应该始终避免。您已经快到了,因为您没有start
您的类的实例,而是将其传递给单独的Thread
实例。
答案 2 :(得分:3)
涉及两个对象,包含run方法的DrawThread对象,以及使用它作为Runnable创建的新Thread。
this.getName获取未启动的DrawThread的名称。当前主题是你开始的主题。
答案 3 :(得分:2)
简单的电话:
new DrawThread().start();
开始新线程
DrawThread drawThread; // declare object of class DrawThread
drawThread = new DrawThread(); // instantiate object of class DrawThread
drawThread.start(); // call start to start DrawThread
(DrawThread正在扩展Thread类)所以涉及:
public synchronized void start() {
checkNotStarted();
hasBeenStarted = true;
nativeCreate(this, stackSize, daemon); // here Thread is created
}
你打电话给ike 穿线内线(AS RUNNABLE):
public Thread(Runnable runnable) {
create(null, runnable, null, 0);
}