Могу ли я узнать атрибуты класса потока выполнения в Java? - PullRequest
0 голосов
/ 24 марта 2012

вероятность, что этот вопрос задавался ранее, но я не могу найти ничего в моем поисковом механизме. Я пытаюсь создать несколько потоков в списке массивов, но я хочу получить их из массива и отфильтровать их по атрибуту w1, который я использовал в своем коде. есть идеи?

    w1 = new FirstWorker(ProductsList, OrdersList, s);
    FirstWorkerThread = new Thread(w1);
    ThreadArrayList.add(FirstWorkerThread);
    //I know i cant do the code below but i want to do that how ?
    for(Thread x : ThreadArrayList){
    x.ProductsList
    }

это класс FirstWorker

import java.lang.String;
import java.util.HashMap;

/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
/**
 *
 * @author Dimitris
 */
public class FirstWorker extends Thread implements Runnable  {

    private OrderList orderlist;
    private ProductList productlist;
    private String Worker;
    boolean Stop;
    private int speed = 1000;

    public FirstWorker(ProductList productlist, OrderList orderlist, String Worker) {
        this.productlist = productlist;
        this.orderlist = orderlist;
        this.Worker = Worker;
        this.Stop = true;
    }

    public void run() {
        if (Stop == true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }

            while (orderlist.returnLengthofOrder() != 0) {

                if (Thread.interrupted()) {
                    System.out.println("I am in the thread inturrupt");
                    // We've been interrupted: no more crunching.
                    return;
                }

                if (orderlist.getDone() == true) {
                } else if (orderlist.getDone() == false) {
                    orderlist.setDoneTrue();

                    orderlist.Purchased(Worker);
                    orderlist.setDoneFalse();

                    try {
                        Thread.sleep(this.speed);
                    } catch (InterruptedException e) {
                        return;
                    }


                }
            }

        }




    }

    public void setWork() {
        Stop = false;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

Ответы [ 4 ]

2 голосов
/ 24 марта 2012

Если вы хотите получить доступ к переменной-члену вашего Runnable, вы должны расширить Thread вместо реализации Runnable. Также не расширяйте Thread и не реализуйте Runnable. Выберите один.

public class MyThread extends Thread
{
    public int myarg;
    public void run()
    {
    }
}

public void useThread(int inputArgs[])
{
    ArrayList<MyThread> threadArray = new ArrayList<MyThread>();
    for (int arg : inputArgs)
    {
        MyThread temp = new MyThread(arg);
        temp.start();
        threadArray.add(temp);            
    }
    for (MyThread t : threadArray)
        System.out.println(t.myarg);

}
0 голосов
/ 24 марта 2012

Вам следует рассмотреть возможность использования нового пакета java.util.concurrent.То, что вы пытаетесь сделать, может быть реализовано намного проще и интуитивнее с помощью ExecutorService и коллекции Callables.

Извлеките этот образец и Executors API (в частности, fixedThreadPool).

0 голосов
/ 24 марта 2012

Если вы хотите получить свойства из экземпляра Runnable в объекте Thread, я не верю, что это вообще возможно, поскольку класс Thread не имеет метода для возврата целевого объекта Runnable..

Тем не менее, вы всегда можете расширить сам класс Thread, что позволит вам использовать instanceof с самими Thread экземплярами до приведения и получения того свойства, которое вам нужно.

Имейте в виду, однако, что расширение Thread не является рекомендуемой практикой , и если вы намерены получить результат некоторых вычислений прямо из объекта Runnable, вы можете столкнуться с некоторымисерьезные проблемы, если вы не будете осторожны.

В любом случае, последние версии Java (то есть 1.5+) предлагают существенные возможности для параллелизма, и я подозреваю, что ваше приложение выиграет от перепроектированиякоторый использует их.

Мы могли бы помочь больше, если бы вы объяснили, что именно вы пытаетесь сделать в более широком смысле ...

0 голосов
/ 24 марта 2012

Простой ответ при создании Thread с Runnable: no.

Используемый вами конструктор Thread принимает Runnable ... Я предполагаю, что FirstWorker реализует интерфейс Runnable.

Но, глядя на документы API для Thread http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html, нет способа вернуть Runnable.

Не зная больше контекста о том, что вы пытаетесь сделать, простейшим подходом может быть изменение FirstWorker наЕсли вы продлите Thread, то цикл, который у вас есть, будет работать.

Это, вероятно, сработает, но для того, чтобы порекомендовать что-то еще, вам нужно знать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...