我有用于在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()
为什么要Thread.currentThread().getName()返回正确的线程名称而又this.getName()返回其他?
您的DrawThread课程,extends Thread但随后您通过调用以下内容开始:
DrawThread
extends Thread
new Thread(new DrawThread(...));
这是不正确的。这意味着创建的线程实际是 不 一样Thread的DrawThread。 DrawThread应该实现Runnable而 不是 扩展线程。您的代码可以工作,因为线程也是可运行的。
Thread
Runnable
public class DrawThread implements Runnable {
因为有两个线程对象,所以当您调用this.getName()的DrawThread对象不是实际运行的线程时,因此其名称设置不正确。仅设置包装线程的名称。在DrawThread代码内部,应调用Thread.currentThread().getName()以获取运行线程的真实名称。
最后,你的类也许应该是DrawRunnable,如果它implements Runnable。:-)
DrawRunnable
implements Runnable