2013-06-17 5 views
1

У меня есть задача сделать, и я немного застрял. Я должен сделать 4 услуги (A, B, C, D). У каждого сервиса должна быть своя нить. Они должны начинаться последовательно и запускаться. Если служба A запускается, тогда можно запустить службу B, если служба B запускается, если запускается служба C, тогда можно запустить службу D. Мне удается создать службу и их потоки, но я не знаю, как мне создать связь между методом start() и priority() в классе PriorityService. Я хочу проверить, жив ли сервис (поток) A, и хочу ли я перейти к второй службе из списка и так далее. Это возможно? Есть ли у вас какие-либо другие идеи, как писать зависимость от службы? Любой совет полезен. Tnx.связь между методом run() и другим методом класса (потоки java)

Вот мой код:

import java.util.*; 

class CreateThread extends Thread{ 
    private String thread_name; 
    public int numb; 
    public CreateThread(String thread_name, int i){ 
     this.thread_name=thread_name; 
     System.out.println("Thread " + thread_name + " has started."); 
     i=numb; 
    } 
    public void run(){ 
     try{ 
      Thread t = Thread.currentThread(); 
      System.out.println(thread_name + " status = " + t.getState()); 
      System.out.println(thread_name + " status = " + t.isAlive()); 
      t.join(); 
     }catch(Exception e){ 
      System.out.println(e); 
     } 

    } 
} 

class PriorityService extends ArrayList<Service> { 
    public void priority() 
    { 
     int i=0; 
     while(i<size()){ 
       System.out.println("evo me"+ get(i).service_name); 
        if(get(i).service_name=="Service A") 
         get(i).StartService(get(i).service_name, get(i).thread_name, i); 
        i++; 
      } 
    } 
} 

public class Service { 
    public String service_name; 
    public String thread_name; 

    public Service(String service_name, String thread_name){ 
     this.service_name=service_name; 
     this.thread_name=thread_name; 
    } 

    public void StartService(String service_name, String thread_name, int i) { 
     System.out.println("Service " + service_name + " has started."); 
     Thread t=new Thread(new CreateThread(thread_name, i)); 
     t.start(); 
    } 

    public void StopService() {} 
    public static void main (String[] args){ 
     PriorityService p_s=new PriorityService(); 
     Service service_A = new Service("Service A", "Thread A"); 
     Service service_B = new Service("Service B", "Thread B"); 
     Service service_C = new Service("Service C", "Thread C"); 
     Service service_D = new Service("Service D", "Thread D"); 
     p_s.add(service_A); 
     p_s.add(service_B); 
     p_s.add(service_C); 
     p_s.add(service_D); 
     p_s.priority(); 

     for(Service s: p_s) 
      System.out.println(s.service_name);  

    } 
} 
+0

Чтение - 'i = numb' в конструкторе' CreateThread' кажется неправильным, не должно быть наоборот? – selig

+0

Вызов 'join' в текущем потоке ничего не сделает. – selig

+0

, что мир кода остался там, потому что я пытался отправить int i из цикла while в класс CreateThread, а затем, если этот поток жив, i ++ witch становится numb в методе run() и отправляет его методу while в методе priority(). Я не знаю, хорошая ли это идея, потому что я новичок в программировании. – njamanjam

ответ

0

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

Только так вы можете сделать это, между потоками связи с использованием ждать, извещать, присоединиться и т.д.

Но я думаю, что в случае, если случае решение может быть, создать отдельный поток для одной комбинации обслуживания A, B, C & D.

+0

Я понял, что хорошо, вы думаете, что я должен создать Threads for Service отдельно, а затем передать их службе, а затем только в методе priority() я должен управлять вызовом метода run() для каждой службы? – njamanjam

+0

То, что я говорю, это перепроектировать таким образом, чтобы ваши сервисы (A, B, C, D) выполнялись последовательно в одном потоке. Создайте много потоков для таких исполнений. –

0

Для этого вам следует использовать защелки.

Вы можете использовать 2 защелки для одного для каждой пары потоков, и это должно выполнять вашу работу. Таким образом, один Latch будет доступен для Threads A и B, что подразумевает, что до тех пор, пока оба они не будут запущены, они не смогут продолжить. Аналогично для C и D.

В этом link приведен пример использования защелки, просто взгляните.

Смежные вопросы