这是我的代码:
public class DJ {
static Thread djThread = new DJPlayThread();
public static void play(){
djThread.start();
}
}
但是一旦该线程启动,我该如何运行DJPlayThread
类内的方法?
感谢。
答案 0 :(得分:5)
这是一个如何做你要求的简单例子:
public class ThreadControl {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable("MyRunnable");
Thread thread = new Thread(myRunnable);
thread.setDaemon(true);
thread.start();
myRunnable.whoAmI();//call method from within thread
try {
Thread.sleep(6000);
} catch (InterruptedException e) {
}
myRunnable.isStopped.set(true);//stop thread
}
static class MyRunnable implements Runnable {
public String threadName;
public AtomicBoolean isStopped=new AtomicBoolean(false);
public MyRunnable() {
}
public MyRunnable(String threadName) {
this.threadName = threadName;
}
public void run() {
System.out.println("Thread started, threadName=" + this.threadName + ", hashCode="
+ this.hashCode());
while (!this.isStopped.get()) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
System.out.println("Thread looping, threadName=" + this.threadName + ", hashCode="
+ this.hashCode());
}
}
public void whoAmI() {
System.out.println("whoAmI, threadName=" + this.threadName + ", hashCode="
+ this.hashCode());
}
}
}
答案 1 :(得分:2)
public class DJ {
private DJPlayThread djThread = new DJPlayThread();
public void play() throws InterruptedException {
djThread.start();
Thread.sleep(10000);
djThread.stopMusic();
}
public static void main(String[] args){
try{
new DJ().play();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class DJPlayThread extends Thread{
private AtomicBoolean running = new AtomicBoolean(true);
@Override
public void run() {
while(running.get()){
System.out.println("Playing Music");
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void stopMusic(){
//be careful about thread safety here
running.set(false);
}
}
应打印出来:
Playing Music
Playing Music
Playing Music
Playing Music
Playing Music
Playing Music
Playing Music
Playing Music
Playing Music
Playing Music
在线程之间交换信息时要非常小心线程安全性。在跨线程上下文访问和修改变量时会发生一些奇怪的事情。