Опитвам се да разбера нишките в 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