WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Как вы можете использовать вычислительные потоки для фоновой обработки?

Как вы можете использовать вычислительные потоки для фоновой обработки?


Дата публикации: 17-03-2013

Предложение от Vivek Pabby

Это вычислительный поток, который будет выполнять вашу фоновую "работу" (или любую задачу по желанию). Этот вычислительный поток будет порожден от вашей основной программы или аплета (они так же приведены).

//
// This class implements the Runnable interface - one way to implement threads
//

class myBackgroundSlave implements Runnable
{

// The constructor - if you need it - will be executed when you instantiate this class
public myBackgroundSlave()
{
// do stuff...
}

// The run method is executed when the thread is started by your main routine - shown below
public void run() {

// Write code here to
// do whatever u want...it will be done in a separate thread
// It will be like a background task.

}
}


//
// The main routine... that will instantiate the thread class and start it
//
// The following class could be an applet - u can spawn a thread to do some background task from
// the applet on the click of a button or something

public class theMaster extends Applet
{

// Just in case you want this class to also execute standalone (as an application)
// u can include the main() method. It would not hurt if the class is run as an
// applet

public static void main (String args[]) {
new serverSocket().init();
}

// The init method for the class.
public void init() {
// do whatever......
}

//
// The slaveDriver method will spawn the thread class above. This method can be
// invoked when the user clicks a button or something. The code that calls this method is
// not shown in this example but you can call it from wherever is required.
//

public void slaveDriver()
{
// instantiate the class that will do the background processing
myBackgroundSlave slave1 = new myBackgroundSlave();

// Create a new thread and start it. The run() method in the myBackgroundSlave will
// be started by the start() method.

new Thread(slave1).start();
}
}
}

2. Как вы можете эффективно синхронизировать два вычислительных потока, если один из потоков зависит от других данных или задач, но время работы лругого потока не определено? (Хинт: очередь ответов синхронизирована?)

Предложение от Steve M. Greek

Вот немного кода, который я нашел в Java Programmers Guide. Два асинхронных вычислительных потока (Producer-производитель и Consumer-потребитель) синхронизированы путем использования объекта CubbyHole который имеет некоторые синхронизированные методы get() и put().

Для экстремального примера того, как это может быть использовано с немерянной кучей вычислительных потоков смотри сюда http://www.csiro.au:8000/steve/stuff/life/JavaLife.html. Эта имплементация игры John Conway "Game of Life", где каждая ячейка это запущенный свой собственный вычислительный поток. Java код находиться в той же самой директории - на случай если захочеться посмотреть. Там всего три класса -- JavaLife.java, Cell.java и Sync.java.

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

Если вы хотите получить больше информации, вы можете послать мне e-mail (по-английски) Steve.Green@its.csiro.au.


class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;

public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}

public void run() {
for (int i=0; i<10; i++) {
cubbyhole.put(i);
System.out.println("Producer #" + this.number + " put: "
+ i);
try {
sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {}
}
}
}

class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;

public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}

public void run() {
int value = 0;
for (int i=0; i 2) dialog = 0;
}
} catch ( IOException e ) {
return;
} catch ( InterruptedException e ) {
return;
}
}
}
Жми сюда для примера!
Предложение от Cliff Berg

Один путь - посулка события компоненту контролируемому главным вычислительным потоком.
Например:


// Post a data-arrival event to the applet
Event evt1 = new Event(master, Event.ACTION_EVENT, "HI THERE MASTER!");
master.postEvent(evt1);


Замечание: этот код требует, чтобы ведомый (дочерний) вычислительный поток передал хендл главному потоку - в часности как параметр в конструкторе ведомого потока:

public SlaveThread(MasterThread m)
{
// Call the superclass constructor (for Thread)
super();

// The slave stores reference to the master:
master = m;
}


7. Как мне разбудить уснувший (suspend) вычислительный поток? Могу ли я разбудить спящий (sleep) вычислительный поток?

Предложение от Doug Erickson

Пути разбудить вычислительный поток в котором был вызван метод sleep() - нет. Он проснется сам и продолжит свое выполнение только тогда, когда исчетчет указанное время. Если вы хотите разбудить вычислительный поток, но не знаете когда это потребуется используйте методы suspend() и resume().



8. Как выполнить внешнюю программу в Java, передать ей параметры и вернуться обратно в программу?

Предложение от Cliff Berg

Вот небольшой пример, который запускает мелкомягкий вордпад с документом "mydoc.doc" в качестве параметра, а затем он (пример) ждет, пока этот вордпад закончит свою работу:


Runtime rt = Runtime.getRuntime();
System.out.println(rt);

Process pr = null;
try pr = rt.exec(
"C:\\Program Files\\Accessories\\WORDPAD.EXE C:\\mydoc.doc");
catch (java.io.IOException ex1)
{
System.out.println("IO Exception when calling exec");
System.exit(1);
}
System.out.println(pr);
try pr.waitFor();
catch (InterruptedException ex2)
{
System.out.println("Interrupted exception when calling waitFor");
}


9. Как можно загрузить два аплета в одно и тоже время?

Предложение от John Pritchard

Это против тебя. Загрузчик классов загружает ваши аплеты по одному потомучто в системе имеется только один центральный процессор, так что время проверки инициализации и загрузки в ваших руках. Аплеты действительно значительно различаются внутри своих методов init(), больше, чем с наружи, так что будь осторожным пытаясь сделать слишком многое оттуда. После того, как отработает метод Applet.init аплеты ведут себя уже хорошо. Многие из полезных системных инструментов java хотели бы получить аплет по его имени при помощи java.applet.AppletContext.getApplet(). Но опять же это сработает, только после того, как "кто-то" будет проинициализирован. Так что если вам вдруг взбредет в голову загружать картинки по сети, то вы можете потерять много времени на синхронизацию с другими в каждом маленьком init(), а затем на выдачу любому синхронизированному аплету имени на следование очереди в их соответствующих вычислительных потоках (run()).


10. Как послать асинхронно информацию или запрос серверной программе и в то же время слушать (ожидать) ответ, причем без "смертельного тупика" (бесконечный цикл ожидания)?

Предложение от John Pritchard

Используйте java.io.InputStream.available() для того, чтобы узнать об доступных байтах, а затем читайте их и продолжайте выполнять другую работу до тех пор, пока вы не будете иметь всех необходимых байтов во входном потоке.
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Bjarne Stroustrup:

"Я всегда мечтал о том, чтобы моим компьютером можно было пользоваться так же легко, как телефоном; моя мечта сбылась: я уже не могу разобраться, как пользоваться моим телефоном."

Опрос

Ваша ОС?

Windows XP
Windows 7
др. версия Windows
Linux
др. ОС