2011-04-30 120 views
4

我正在为我的作业编写代码,我对编写多线程应用程序并不太熟悉。我学会了如何打开一个线程并启动它。我更好地展示代码。Java多线程,如何停止?

for (int i = 0; i < a.length; i++) { 
    download(host, port, a[i]); 
    scan.next();       
} 

我上面的代码连接到服务器打开a.length多个并行请求。换句话说,下载将打开a[i]连接,以在每次迭代中获取相同的内容。但是,我希望我的服务器在i = 0完成下载方法并开始下一次迭代i = 1,此时已下载的线程已打开完成。我用scan.next()手动完成,但显然这不是一个好的解决方案。我怎样才能做到这一点?

编辑:

public static long download(String host, int port) { 
    new java.io.File("Folder_" + N).mkdir(); 
    N--; 
    int totalLength = length(host, port); 
    long result = 0; 
    ArrayList<HTTPThread> list = new ArrayList<HTTPThread>(); 
    for (int i = 0; i < totalLength; i = i + N + 1) { 
     HTTPThread t; 
     if (i + N > totalLength) { 
      t = (new HTTPThread(host, port, i, totalLength - 1)); 
     } else { 
      t = new HTTPThread(host, port, i, i + N); 
     } 
     list.add(t); 
    } 

    for (HTTPThread t : list) { 
     t.start(); 
    } 
    return result; 
} 

在我HTTPThread;

public void run() { 
    init(host, port); 
    downloadData(low, high); 
    close(); 
} 

注:我们的测试Web服务器是一个修改后的web服务器,它就会范围:i-j并在响应中,有i-j文件的内容。

回答

5

您将需要调用正在下载的线程的join()方法。这将导致当前线程等待,直到下载线程完成。 This是一篇关于如何使用连接的好文章。

如果您想发表您的下载方法,你可能会得到一个更完整的解决方案

编辑:

好了,你开始你的线程后,你将需要加入他们的行列,像这样:

for (HTTPThread t : list) { 
    t.start(); 
} 
for (HTTPThread t : list) { 
    t.join(); 
} 

这将停止方法返回,直到所有HTTPThreads完成

1

它可能不是一个好主意,以创建一个无界并行http请求数量无限的线程数。 (网络套接字和线程都是操作系统资源,并且需要一些簿记开销,因此在许多操作系统中都受到配额限制。另外,您正在阅读的Web服务器可能不像1000个并发连接,因为他的网络套接字是也是有限的!)。

您可以用轻松地控制并发连接数的ExecutorService

List<DownloadTask> tasks = new ArrayList<DownloadTask>(); 
    for (int i = 0; i < length; i++) { 
     tasks.add(new DownloadTask(i)); 
    } 
    ExecutorService executor = Executors.newFixedThreadPool(N); 
    executor.invokeAll(tasks); 
    executor.shutdown(); 

这既是短,比你的自产自销的并发限制更好,因为你的限制将推迟开始下一批次直到所有当前批次的线程已完成。通过ExceutorService,每当旧任务完成时(即使还有任务),都会开始新任务。也就是说,您的解决方案将有1到N个并发请求,直到所有任务都已启动,而ExecutorService将始终有N个并发请求。