これが私のコードです:
public class DJ {
static Thread djThread = new DJPlayThread();
public static void play(){
djThread.start();
}
}
DJPlayThread
しかし、そのスレッドが開始されたら、クラス内にあるメソッドを実行するにはどうすればよいですか?
ありがとう。
これが私のコードです:
public class DJ {
static Thread djThread = new DJPlayThread();
public static void play(){
djThread.start();
}
}
DJPlayThread
しかし、そのスレッドが開始されたら、クラス内にあるメソッドを実行するにはどうすればよいですか?
ありがとう。
これは、あなたが尋ねることを行う方法の簡単な例です:
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());
}
}
}
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
スレッド間で情報を交換するときは、スレッドの安全性に十分注意してください。スレッド コンテキスト間で変数にアクセスして変更すると、奇妙なことがいくつか発生します。