⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taskmanage.java

📁 一个简单的多线程下载程序
💻 JAVA
字号:
package com.network.flashget;

import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import java.awt.Color;

class TaskManage extends Thread implements Serializable
{
	//定义几个必要的变量-----------------------------------------------------------
	public long fileLength = 0;
	public int threadNum = 0;
	public URL url = null;
	public long totalDownLength = 0;
	public String saveTo = null;
	public String fileName = null;
	public LinkedList taskThreadList = new LinkedList();
	public int rowValue = 0;
	public float downRate = 0.0f;
	transient public boolean stopFlag = false;
	transient public boolean changeFlag = false;
	transient public boolean destroyFlag = false;
	
	
	/**
	 *构造函数,主要是为了设置变量-------------------------------------------------
	 **/
	TaskManage(URL url,String saveTo,String fileName,long taskLength,int threadNum)
	{
		rowValue = MainWindow.taskCount - 1;
		this.fileLength = taskLength;
		this.threadNum = threadNum;
		this.saveTo = saveTo;
		this.url = url;
		this.fileName = fileName;
	}

	
	/**
	 *用于为每个线程分配任务
	 **/
	public void assignMission()
	{
		if(threadNum == 1)
		{
			TaskThread taskMission = new TaskThread();
			taskMission.url = url;
			taskMission.startPosition = 0;
			taskMission.finalStart = 0;
			taskMission.finalLength = fileLength;
			taskMission.endPosition = fileLength;
			taskMission.fileName = fileName;
			taskMission.saveTo = saveTo;
			taskMission.finishFlag = false;
			
			System.out.println(taskMission.startPosition);
			System.out.println(taskMission.endPosition);
					
			taskThreadList.add(taskMission);				
		}
		
		else
		{
			TaskThread taskMission = new TaskThread();
			taskMission.url = url;
			taskMission.startPosition = 0;
			taskMission.finalStart = 0;
			taskMission.endPosition = (fileLength /threadNum);
			taskMission.finalLength = taskMission.endPosition - taskMission.startPosition;
			taskMission.fileName = fileName;
			taskMission.saveTo = saveTo;
			taskMission.finishFlag = false;
			
			System.out.println(threadNum);
			System.out.println(taskMission.startPosition);
			System.out.println(taskMission.endPosition);			
			taskThreadList.add(taskMission);
			
			for(int i=1; i<threadNum; i++)
			{
				if(i < threadNum-1)
				{
					TaskThread taskMission1 = new TaskThread();
					taskMission1.url = url;
					taskMission1.startPosition = (((fileLength/threadNum) * i) + 1);
					taskMission1.finalStart = (((fileLength/threadNum) * i) + 1);
					taskMission1.endPosition = (fileLength / threadNum) * (i + 1);
					taskMission1.finalLength = taskMission1.endPosition - taskMission1.startPosition;
					taskMission1.fileName = fileName;
					taskMission1.saveTo = saveTo;
					taskMission1.finishFlag = false;
					
					taskThreadList.add(taskMission1);
				}
				else
				{
					TaskThread taskMission1 = new TaskThread();
					taskMission1.url = url;
					taskMission1.startPosition = (((fileLength/threadNum) * i) + 1);
					taskMission1.finalStart = (((fileLength/threadNum) * i) + 1);
					taskMission1.endPosition = fileLength;
					taskMission1.finalLength = taskMission1.endPosition - taskMission1.startPosition;
					taskMission1.fileName = fileName;
					taskMission1.saveTo = saveTo;
					taskMission1.finishFlag = false;
					
					System.out.println(i);
					System.out.println(taskMission1.startPosition);
					System.out.println(taskMission1.endPosition);
					
					taskThreadList.add(taskMission1);
				}
			}
		}
	}
	
	/**
	 *用于启动下载子线程
	**/
	public void runSubThread()
	{
	//用于启动子线程-------------------------------------------------
		for(int i = 0;i < taskThreadList.size();i++)
		{
			//该线程的任务已经下载完成----------------------------------------------
			if(((TaskThread)taskThreadList.get(i)).downLength >= ((TaskThread)taskThreadList.get(i)).finalLength)
			{
				continue;
			}
			
			//该线程的下载任务没有完成,继续下载--------------------------------------
			else
			{
				((TaskThread)taskThreadList.get(i)).stopFlag = false;
				((TaskThread)taskThreadList.get(i)).start();
			}
		} 
	}
	
	/**
	 *用于启动任务线程------------------------------------------------------------
	 **/
	public void run()
	{
		outter:		
		while(true)
		{	
			//判断暂停标志,是否暂停线程--------------------------------
			try
			{
				sleep(500);
				synchronized(this)
				{
					while(stopFlag)
					{
						for(int i = 0;i < taskThreadList.size();i++)
						{
							if(destroyFlag)
							{
								((TaskThread)taskThreadList.get(i)).destroyFlag = true;
							}
							((TaskThread)taskThreadList.get(i)).stopFlag = true;
							System.out.println("thread Stop");
						}
						if(!changeFlag)
						{
							(MainWindow.tableDownModel).setValueAt("Stop",rowValue,0);
						}
						System.out.println("task Stop");
						if(destroyFlag)
						{
							break outter;
						}	
						wait();
					}
				}
			}			
			catch(InterruptedException e)
			{
				e.printStackTrace();
			}
			
			totalDownLength = 0;
			for(int i = 0;i < taskThreadList.size();i++)
			{
				TaskThread tempThread = (TaskThread)taskThreadList.get(i);
				totalDownLength = totalDownLength + tempThread.downLength;
			}

			//若当前表格中选择的是这个任务,则改变子线程的表格显示----------------------------------------------
			if((MainWindow.tableDown.getSelectedRow())==rowValue && MainWindow.tableDownDetail.getRowCount() == taskThreadList.size())			
			{
				for(int i = 0;i < taskThreadList.size();i++)
				{
					long tempDown = ((TaskThread)taskThreadList.get(i)).downLength;
					(MainWindow.tableDownDetailModel).setValueAt(tempDown,i,4);									
				}
			}
			
			//改变任务表格显示------------------------------------------------------
			downRate = (float)totalDownLength/fileLength;
			synchronized(MainWindow.tableDownDetail)
			{
				(MainWindow.tableDownModel).setValueAt(totalDownLength,rowValue,3);
				(MainWindow.tableDownModel).setValueAt(downRate,rowValue,4);
			}
			
			if(totalDownLength >= fileLength)
			{
				//对表格进行同步处理--------------------------------------------------- 
				synchronized(MainWindow.tableDownDetail)
				{
					ListChangeThread.changed(rowValue);
				}
				break;
			}
		}
	}
	
	//唤醒线程--------------------------------------------------------
	public synchronized void threadNotify()
	{
		stopFlag = false;
		notify();
		System.out.println("task ReStart");
		for(int i = 0;i < taskThreadList.size();i++)
		{
			((TaskThread)taskThreadList.get(i)).stopFlag = false;
			((TaskThread)taskThreadList.get(i)).threadNotify();
		}
		(MainWindow.tableDownModel).setValueAt("Downing",rowValue,0);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -