Я понимаю понятие позади поточной обработки и записал потоки на других языках, но я испытываю затруднения при понимании, как адаптировать их к моим потребностям в Java.
Basicly в настоящее время, у меня есть вектор объектов, которые читаются в из файла последовательно. Файл затем имеет список событий, которые должны произойти одновременно настолько ожидающие одного события для окончания, который занимает 20-30 секунд, не опция.
Существует только несколько методов в объекте, которые имеют дело с этими событиями. Однако от рассмотрения учебных руководств, объекты должны расшириться/реализовать потоки / выполнимый однако, если объект находится в потоке, делающем вызов метода того объекта, кажется, происходит последовательно так или иначе.
Y дополнительная информация ценилась бы, поскольку я ясно пропускаю что-то, что я просто не совсем уверен что!
Таким образом, чтобы подвести итог, как я могу выполнить отдельный метод с помощью потока?
Чтобы запустить поток, вы вызываете start ()
для экземпляра Thread
или его подкласса. Метод start ()
немедленно возвращает . В то же время другой поток (воплощенный экземпляром Thread
) запускается и продолжает выполнение метода run ()
потока Thread
пример.
Управлять потоками не так просто, как кажется. Для более плавного использования API попробуйте использовать Executor
(см. Классы в java.util.concurrent
).
Предположим, что вы можете немного изменить синтаксис, разрешите встроенной базе данных работать с запросом, таким как 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.
Необходимо быть очень осторожным в синхронизации списка и счетчика. Возможны гораздо лучшие структуры данных. Я придерживаюсь грубого для простоты понимания.
Надеюсь, это поможет.
Лучше всего в 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 будет выполняться в отдельном потоке, и это будет параллельно.
Можно запустить транзакцию и проверить, не превышает ли 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- Ключ к потокам - помнить, что каждая задача, которая должна быть запущена, должна быть в своем собственном потоке. Задачи, выполняемые в одном потоке, будут выполняться последовательно. Разделение одновременных задач между отдельными потоками позволит вам выполнять необходимую параллельную обработку.