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 回答