Я пытаюсь понять потоки в Java. Я создал поток, реализующий интерфейс Runnable
, который выполняет определенную функцию определенного класса. Ниже приведены классы Java:
MyThread Class
public class MyThread implements Runnable {
private DataContainer dataContainer;
private Thread thread;
public MyThread(DataContainer dataContainer) {
this.dataContainer = dataContainer;
thread = new Thread(this);
thread.start();
thread.setName("Thread 2");
}
@Override
public void run() {
System.out.println("MyThread : "+dataContainer.toString());
}
public void runThread() {
thread.run();
}
}
DataContainer Class
. Функция, которую я выполняю в потоке
public class DataContainer {
private static DataContainer instance = null;
private DataContainer() {}
public static DataContainer getInstance() {
if(null == instance)
instance = new DataContainer();
return instance;
}
@Override
public String toString() {
return Thread.currentThread().getName()+" : __Data__";
}
}
main class
public class Launcher {
public static void main(String[] args) {
DataContainer dataContainer = DataContainer.getInstance();
MyThread myThread = new MyThread(dataContainer);
int i =0;
while(i++<10) {
System.out.println("Launcher : "+ dataContainer.toString());
myThread.runThread();
}
}
}
Проблема в том, что в цикле while
, где выполняется dataContainer.toString() из основного класса и экземпляра myThread, я получаю вывод, поскольку все они выполняются в одном потоке: main thread
. Ни одно из исполнений в цикле не выполняется с Thread 2
.
Моя цель состоит в том, чтобы in the while loop, I want myThread.runThread()
выполнялось в потоке Thread 2
.
ИЗМЕНИТЬ:
Добавлено thread.start()
. Однако теперь он выполняется только один раз? Я не могу создавать новый поток каждый раз, когда хочу выполнить myThread.runThread(). Создав новый поток в цикле, я в конечном итоге создал кучу потоков. Это целесообразно? Я хочу, чтобы определенный фрагмент кода (скажем, Y) выполнялся потоком (скажем, X). Каждый раз, когда нужно выполнить Y, это следует делать через поток X.
Решение
Это может быть возможным решением:
public class MyThread implements Runnable {
private DataContainer dataContainer;
private Thread thread = null;
public MyThread(DataContainer dataContainer) {
this.dataContainer = dataContainer;
}
@Override
public void run() {
System.out.println("MyThread : "+dataContainer.toString());
}
public void runThread() {
boolean threadIsAlive = (null!=thread && Thread.getAllStackTraces().keySet().contains(thread));
if(null == thread || !threadIsAlive) {
thread = new Thread(this);
thread.start();
} else {
thread.run();
}
}
}
myThread.start();
, чтобы запустить его в другом потоке - person Subin Sebastian   schedule 03.07.2014myThread.runThread()
просто вызовет этот метод в текущем потоке. Если вы хотите, чтобы это выполнялось в новом потоке, поместите этот вызов в методrun
и просто вызовитеthread.start()
. это запускает другой поток и вызывает метод запуска вашего запускаемого объекта. - person Subin Sebastian   schedule 03.07.2014while
, поместите операторы созданияThread
в методrunThread
. - person A Stranger   schedule 03.07.2014edit
вам нужно поместить экземпляр вашего потока в цикл. - person Scary Wombat   schedule 03.07.2014