0

これが私のコードです:

public class DJ {
    static Thread djThread = new DJPlayThread();

    public static void play(){
        djThread.start();
    }
}

DJPlayThreadしかし、そのスレッドが開始されたら、クラス内にあるメソッドを実行するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

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());
        }

    }

}
于 2012-08-20T18:30:47.583 に答える
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

スレッド間で情報を交換するときは、スレッドの安全性に十分注意してください。スレッド コンテキスト間で変数にアクセスして変更すると、奇妙なことがいくつか発生します。

于 2012-08-20T18:52:31.320 に答える