Как запустить определенные части программы в другом потоке и ссылаться на переменные в потоке?

Таким образом, вместо «спящего» потока, как в Thread.sleep();, чтобы просто позволить процессам работать в другом потоке и заставить новый поток спать с Thread.sleep();, но не с исходным Thread. Это возможно?

Вот мой метод, который я хочу запустить на новом Thread с именем processesThread:

    private void Processes() throws IOException, InterruptedException {

        // New Thread "processesThread" will start here.

        Runtime rt = Runtime.getRuntime();
        List<Process> processes = new ArrayList<Process>();

        // "runnableTogether" will be the number that the user inputs in the GUI.

        switch (runnableTogether) {

            case 4:
                processes.add(rt.exec("C:/Windows/System32/SoundRecorder.exe"));
            case 3:
                processes.add(rt.exec("C:/Windows/System32/taskmgr.exe"));
            case 2:
                processes.add(rt.exec("C:/Windows/System32/notepad.exe"));
            case 1:
                processes.add(rt.exec("C:/Windows/System32/calc.exe"));
                Thread.sleep(5000);
                destroyProcesses(processes);

                break;

            default:

                System.exit(0);

                break;

        }

        // New Thread "processesThread" will end here.

    }

Это возможно? И если да, то как?

Я исследовал запуск нового Threads, но не могу понять, как заставить его работать с моей программой.

РЕДАКТИРОВАТЬ: я надеялся использовать что-то похожее на этот подход:

Thread processesThread = new Thread() {
    public void run() {
        // Code here.
    }
};
processesThread.start();

Любые идеи?


person knorberg    schedule 04.07.2013    source источник
comment
Не совсем уверен, что вы пытаетесь здесь сделать, но я бы рекомендовал прочитать о ExecutorService (javacodegeeks.com/2013/01/) (stackoverflow.com/questions/2104676/) и некоторую официальную документацию (docs.oracle.com/javase/6/docs/api/java/util/concurrent/ ), возможно, это может вам помочь, но вам нужно уточнить, что вы пытаетесь сделать :)   -  person AlejandroVK    schedule 04.07.2013
comment
@AlejandroVK По сути, я не хочу, чтобы поток, в котором работает большая часть моей программы, спал. Просто новая ветка.   -  person knorberg    schedule 04.07.2013
comment
Взгляните на приведенные ранее ссылки, они помогут вам в вашем сценарии, где вам нужен пул потоков, которым может управлять менеджер. Это идеальный сценарий для Исполнителя. В противном случае вы можете реализовать это самостоятельно, создав диспетчер потоков, который может засыпать/запускать/останавливать каждый поток на основе любых указанных вами критериев.   -  person AlejandroVK    schedule 04.07.2013


Ответы (1)


Если я правильно понял ваш вопрос, вы хотите знать, как перевести другие потоки в спящий режим, пока текущий поток остается в рабочем состоянии. Вы можете использовать wait и notify.

Вот пример;

final Object mon = ...;
Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        synchronized (mon) {
            try {
                mon.wait(); //blocks the t1 thread
            } catch (InterruptedException e) {
                //
            }
        }
    }
});

mon.wait() блокирует поток t1 до тех пор, пока другой поток не вызовет mon.notify() для пробуждения потока, ожидающего объект mon. Вы также можете вызвать mon.notifyAll(), если на мониторе ожидает более одного потока - это разбудит их всех. Однако только один из потоков сможет захватить монитор (помните, что ожидание находится в синхронизированном блоке) и продолжить работу, тогда как остальные будут заблокированы до тех пор, пока не смогут получить блокировку монитора.

person Iarwa1N    schedule 04.07.2013
comment
Вы не возражаете, если я дам вам ссылку на PasteBin, чтобы показать вам всю мою программу? Было бы намного проще! Может быть, вы могли бы показать мне, как я буду реализовывать ваш подход? - person knorberg; 04.07.2013