2016-03-01 1 views
1

Я создаю несколько потоков из timertask, и все работает отлично для первого выполнения timertask. Но когда timertask выполняется во второй раз, Thread.start() не вызывает метод run(). Я пробовал каждый вариант, с которым сталкивался в Интернете, но ничего не работает. Кто-нибудь может мне помочь, пожалуйста !!! :(TimerTask + multiThreading + java, не работает для второго выполнения

Это, как я график TimerTask:

Timer timer = new Timer(); 
timer.scheduleAtFixedRate(new orderProcessScheduler(), getDate(), interval_period); 

Вот TimerTask:

public class orderProcessScheduler extends TimerTask{ 

public void processOrders() 
{ 
    try 
    { 

     int totalThreads = 10; 
     List<orderThreadImpl> threadPool = new ArrayList<orderThreadImpl>(); 

     for(int i = 0;i<totalThreads;i++) 
     { 
      threadPool.add(new orderThreadImpl()); 
     } 

    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    processOrders(); 
} 
} 

Вот реализация потока:

public class orderThreadImpl implements Runnable{ 

private Thread t; 


@Override 
public void run() { 
    // TODO Auto-generated method stub 

    try 
    { 

     // code for what this thread is suppose to do 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

public orderThreadImpl() 
{ 
    this.t = new Thread(this); 
    t.start(); 
} 
+1

Вы должны рассмотреть возможность использования ThreadPoolExecutor https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html – Xvolks

+1

Не делать 'новую тему (это). start() 'в конструкторе! Это потенциально позволяет новому потоку видеть объект 'this' в частично инициализированном или неинициализированном состоянии. Google для «утечки этого» для получения дополнительной информации. –

+0

Ваша переменная 'threadPool' имеет обманчивое имя: Обманчиво, потому что это не _pool_, если вы не используете повторное использование потоков. Задача таймера создает все новые потоки при каждом запуске. –

ответ

0

Вот что вы должны сделать, использовать пул потоков службы исполнителя, чтобы управлять вашими потоками и запускать каждый поток для вас:

import java.util.Timer; 
import java.util.TimerTask; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 

public class TimerTaskQuestion { 

    public static void main(String[] args) { 
     OrderProcessScheduler orderScheduler = new OrderProcessScheduler(); 
     Timer timer = new Timer(); 
     timer.schedule(orderScheduler, 500, 1000); 
    } 

    public static class OrderProcessScheduler extends TimerTask { 

     private ExecutorService ex; 

     public OrderProcessScheduler() { 
      this.ex = Executors.newFixedThreadPool(10); 
      try { 
       this.ex.awaitTermination(1, TimeUnit.SECONDS); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     @Override 
     public void run() { 
      System.out.println("Number of active thread : " + ((ThreadPoolExecutor)this.ex).getActiveCount()); 
      this.ex.execute(new orderThreadImpl()); 
     } 

     public void initiateShutdown(){ 
      this.ex.shutdown(); 
     } 
    } 

    public static class orderThreadImpl implements Runnable { 

     @Override 
     public void run() { 
      try { 
       System.out.println("Executed from : " + Thread.currentThread().getName()); 
       Thread.sleep(3000); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
Смежные вопросы