访问线程并在Thread类中运行一个方法

时间:2012-08-20 18:23:55

标签: java multithreading class

这是我的代码:

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

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

但是一旦该线程启动,我该如何运行DJPlayThread类内的方法?

感谢。

2 个答案:

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

在线程之间交换信息时要非常小心线程安全性。在跨线程上下文访问和修改变量时会发生一些奇怪的事情。