2015-07-29 1 views
2

У меня есть класс Thread, который, как предполагается, читает текстовый файл и подсчитывает количество слов в текстовом файле. Вызов запуска нижеследовал:Поиск последнего активного потока для печати чего-то

/** 
* Executes and counts # of words in textfile 
*/ 
public void run() 
{ 
    lock.readLock().lock(); 
    try 
    { 
     while(in.hasNext()) 
     { 
      String tmp = in.next(); 
      character ++; 
      totalCharacter++; 
     } 
     System.out.println(input + ": " + character); 
     /** 
     if(Thread.activeCount() == 0) 
     { 
      System.out.println("Total characters in all textfiles: " + totalCharacter); 
     } 
     */ 
    } 
    finally 
    { 
     lock.readLock().unlock(); 
    } 

} 

Я не могу понять, как я могу найти последнее Running тему, так что я могу напечатать общее количество символов из каждого текстового файла, который называется. Я попытался сделать это с прокомментированным разделом Thread.activeCount() == 0, но это не сработало.

Любые советы о том, где и где можно найти последнюю текущую нить, чтобы распечатать общее количество слов во всех текстовых файлах?

Основная функция будет выглядеть следующим образом (я использую аргументы командной строки для ввода информации в):

public static void main(String[] args) throws FileNotFoundException, InterruptedException 
{ 
    for(int i = 0 ; i < args.length ; i++) 
    { 
     Thread2 wct = new Thread(args[i]); 
     wct.start(); 
    } 

} 
+0

ли не 'Thread.activeCount' должен быть 1, как текущий поток все еще работает? – KDM

+0

Я играл с функцией activeCount, и ни 1, ни 0 не работает. – Shimy

ответ

1

Я написал небольшую программу:

package ant.test; 

import java.util.Random; 

public class ThreadTest implements Runnable { 

    private int msec; 

    public ThreadTest(int msec) { 
     this.msec = msec; 
    } 

    public static void main(String[] args) { 
     Random r = new Random(); 
     for(int i = 0; i < 5; i++) 
      new Thread(new ThreadTest(r.nextInt(1000))).start(); 
    } 

    @Override public void run() { 
     System.out.println("Thread.activeCount = " + Thread.activeCount() + " activeThead = " + Thread.currentThread().getId()); 
     try { 
      Thread.sleep(msec); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("Thread.activeCount(exiting) = " + Thread.activeCount() + " activeThead = " + Thread.currentThread().getId()); 
     if(Thread.activeCount() == 2) { 
      Thread[] tarray = new Thread[5]; 
      int nThreads = Thread.enumerate(tarray); 
      for (int i = 0; i < nThreads; i++) { 
       System.out.println(tarray[i].getName()); 
      } 
     } 
    } 
} 

В результате, когда выполняется последний поток, количество активных потоков равно двум. Текущий поток и DestroyJavaVM Thread. Смотрите ниже вывод:

Thread.activeCount = 4 activeThead = 8 
Thread.activeCount = 4 activeThead = 9 
Thread.activeCount = 5 activeThead = 10 
Thread.activeCount = 6 activeThead = 11 
Thread.activeCount = 6 activeThead = 12 
Thread.activeCount(exiting) = 6 activeThead = 8 
Thread.activeCount(exiting) = 5 activeThead = 11 
Thread.activeCount(exiting) = 4 activeThead = 12 
Thread.activeCount(exiting) = 3 activeThead = 10 
Thread.activeCount(exiting) = 2 activeThead = 9 
Thread-1 
DestroyJavaVM 

Это сказало, проверяя activeThreadCount не кажется мне правильное решение. Вы можете использовать какой-то счетный семафор для достижения того, что вы ищете.

2

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

public static void main(String[] args) throws FileNotFoundException, InterruptedException { 
    for (int i = 0 ; i < args.length ; i++) { 
     Thread2 wct = new Thread(args[i]); 
     wct.start(); 
     System.out.println("Thread #" + i + " has id " + wct.getId()); 
    } 
} 

System.out заявление, которое я добавил позволит вам соотнести количество нити с проточной ид, для последующего сравнения, если вы хотите этого.

И тогда в вашем методе нить run(), вы также можете распечатать идентификатор текущего выполняющегося потока перед нить завершения выполнения:

public void run() { 
    lock.readLock().lock(); 
    try { 
     while(in.hasNext()) { 
      String tmp = in.next(); 
      character ++; 
      totalCharacter++; 
     } 
     System.out.println(input + ": " + character); 
    } 
    finally { 
     lock.readLock().unlock(); 
     long threadId = Thread.currentThread().getId(); 
     // print out id of this Thread 
     System.out.println("Thread with id " + threadId + " is about to finish executing"); 
    } 
} 
+0

Я играл с этой идеей; однако, как я должен делать вещи с последним потоком после того, как у меня есть ID. – Shimy

0

Ниже раствора на основе CountDownLatch:

Class myRunnable implements Runnable 
{ 
    CountDownLatch cdl; 

    public myRunnable(CountDownLatch cd1) 
    { 
     this.cd1 = cd1; 
    } 

    public void run() 
    { 
     lock.readLock().lock(); 
     try 
     { 
      // Your code logic 

      cdl.countDown(); 

      if(cd1.getCount() == 0) 
       System.out.println("Total characters in all textfiles: " + totalCharacter);     
     } 
     finally 
      lock.readLock().unlock(); 
    } 
    } 

Class Demo 
{ 
    public static void main(String[] args) 
    { 
    CountDownLatch cdl = new CountDownLatch(10); 
    for(int i = 0 ; i < 10 ; i++) 
    { 
     Thread2 wct = new Thread(new myRunnable(cd1)); 
     wct.start(); 
    } 
    cd1.await(); 
    } 
} 
Смежные вопросы