Методы Java, Работающие в потоках

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

Basicly в настоящее время, у меня есть вектор объектов, которые читаются в из файла последовательно. Файл затем имеет список событий, которые должны произойти одновременно настолько ожидающие одного события для окончания, который занимает 20-30 секунд, не опция.

Существует только несколько методов в объекте, которые имеют дело с этими событиями. Однако от рассмотрения учебных руководств, объекты должны расшириться/реализовать потоки / выполнимый однако, если объект находится в потоке, делающем вызов метода того объекта, кажется, происходит последовательно так или иначе.

Y дополнительная информация ценилась бы, поскольку я ясно пропускаю что-то, что я просто не совсем уверен что!

Таким образом, чтобы подвести итог, как я могу выполнить отдельный метод с помощью потока?

7
задан john 18 February 2010 в 21:22
поделиться

4 ответа

Чтобы запустить поток, вы вызываете start () для экземпляра Thread или его подкласса. Метод start () немедленно возвращает . В то же время другой поток (воплощенный экземпляром Thread ) запускается и продолжает выполнение метода run () потока Thread пример.

Управлять потоками не так просто, как кажется. Для более плавного использования API попробуйте использовать Executor (см. Классы в java.util.concurrent ).

5
ответ дан 7 December 2019 в 05:21
поделиться

Предположим, что вы можете немного изменить синтаксис, разрешите встроенной базе данных работать с запросом, таким как T-SQL:

select case when <Expression> then 1 else 0 end as Result

На примере

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result
-121--3357702-

можно запустить транзакцию и проверить, не превышает ли значение SELECT COUNT (*) MY_TABLE WHERE SALATE < 50000 больше 1.

-121--3690426-

Томас уже предоставил технические детали. Я постараюсь сосредоточиться на логике.

Вот что я могу предложить из моего понимания вашей проблемы.

Допустим, у вас есть коллекция объектов типа X (или даже комбинация различных типов). Необходимо вызвать методы foo и/или bar в этих объектах на основе определенного события. Так что теперь, возможно, у вас есть вторая коллекция, которая хранит их.

Итак, у нас есть два объекта List (один для X объектов и другой для событий).

Теперь у нас есть функция выполнения, которая возьмет X, и событие, и вызовет foo или bar. Этот метод выполнения может быть свернут в поток и выполнен одновременно. Каждый из этих потоков может взять один объект из списка, увеличить счетчик и выполнить foo/bar. После этого проверьте счетчик и возьмите следующий из списка. В списке можно использовать 5 или более этих потоков.

Таким образом, как мы видим, объекты, поступающие из файла, не должны быть объектами Thread.

Необходимо быть очень осторожным в синхронизации списка и счетчика. Возможны гораздо лучшие структуры данных. Я придерживаюсь грубого для простоты понимания.

Надеюсь, это поможет.

1
ответ дан 7 December 2019 в 05:21
поделиться

Лучше всего в Java создать другой класс, который принимает данные, которые вам нужно обработать, и выполняет все, что вам нужно:

    class Worker implements Runnable{

    Object mydata;
    Worker(Object data)
    {
        mydata = data;
    }

    @override
    void run()
    {
        //process the data
        System.out.println(data.toString());

        //or if you want to use your class then:
        YourClass yc = (YourClass)myData;
        yc.methodB();
    }
}

class YourClass
{
    private final ExecutorService executor = Executors.newCachedThreadPool();
    private ArrayList<Object> list;
    YourClass()
    {
        list = new ArrayList<Object>();
        list.add(new Object());
        ...
        ...
        list.add(new Object());
    }

    void methodA()
    {
        for(Object item : list )
        {
            // Create a new thread with the worker class taking the data
            executor.execute(new Worker(item));
        }
    }

    void methodB(){/*do something else here*/}
}

Обратите внимание, что вместо получения данных вы можете передать реальный класс, на котором нужно вызвать метод:

executor. execute(new Worker(new MyClass()));

В методе run класса Worker вы вызываете все, что вам нужно вызвать на MyClass... executor создает новый поток и вызывает run на вашем Worker. Каждый Worker будет выполняться в отдельном потоке, и это будет параллельно.

2
ответ дан 7 December 2019 в 05:21
поделиться

Можно запустить транзакцию и проверить, не превышает ли MY_TABLE SELECT COUNT (*) 50000 WHERE SALARY < 1.

-121--3690426-

I 'd подкласс QPushButton и определить собственного отправителя и слот. Метод QObject.sender () является заманчивым, но он дает мне heebie-jeebies.

class MyPushButton(QPushButton):
    def __init__(self, text = '', parent = None):
        QPushButton.__init__(self, text, parent)
        self.clicked.connect(self._handle_click)

    my_click = QtCore.pyqtSignal(QObject)

    def _handle_click(self):
        my_click.emit(self)

def btnclick(btn):
    print 'Handle button %s' % btn

for i in xrange(20):
    btn = MyPushButton('%s %s' % ('Button', i + 1), self)
    btn.my_click.connect(btnclick)

Несколько более Pythonic способ сделать это может определить поведение внутри класса, как это:

class MyPushButton(QPushButton):
    def __init__(self, button_number, parent = None):
        QPushButton.__init__(self, '%s %s' % ('Button', button_number), parent)
        self.button_number = button_number
        self.clicked.connect(self._handle_click)

     def _handle_click(self):
        print 'Handle button %s' % self

for i in xrange(20):
    btn = MyPushButton(i + 1, self)
-121--4013109-

Ключ к потокам - помнить, что каждая задача, которая должна быть запущена, должна быть в своем собственном потоке. Задачи, выполняемые в одном потоке, будут выполняться последовательно. Разделение одновременных задач между отдельными потоками позволит вам выполнять необходимую параллельную обработку.

0
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: