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

📄 taskthread.java

📁 一个java编写的下载器源码
💻 JAVA
字号:
package com.leapget.util;

import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;

import javax.swing.JOptionPane;

import com.leapget.view.MainAppFrame;

/**
 * 任务线程
 * 
 * @author 0501xql
 * @since 2008-8-4
 * @version 1.0
 */
public class TaskThread implements Runnable {

	private TaskInfo task; 		// 当前任务的相关信息
	private File tmpFile;		// 当前任务的临时文件
	private ArrayList<SubTaskThread> subThreads;

	public TaskThread(ThreadGroup tgParent, TaskInfo task) {
		this.task = task;
		this.tmpFile = FileHelper.getTempFile(task.getSavePath());
		this.subThreads = new ArrayList<SubTaskThread>();
	}

	public TaskInfo getTask() {
		return this.task;
	}

	public File getTmpFile(){
		return tmpFile;
	}
	
	public ArrayList<SubTaskThread> getSubThreads(){
		return subThreads;
	}
	public void setTask(TaskInfo task) {
		this.task = task;
	}

	// 暂停当前的任务
	public void pause() { // 设置当前状态为暂停
		task.setState(TaskInfo.TASK_PAUSED);
	}

	// 恢复下载
	public void resume() {
		task.setState(TaskInfo.TASK_NORMAL);
		task.setLastMillis(Calendar.getInstance().getTimeInMillis());
		for(SubTaskThread subThread : subThreads){
			new Thread(subThread).start();
		}
	}

	// 删除下载
	public void delete() {
		task.setState(TaskInfo.TASK_DELETEED);
	}

	// 下载出错
	private void error() {
		task.setState(TaskInfo.TASK_ERROR);
	}

	// 子线程失败
	public void subThreadError(SubTaskThread subThread) {
		if (Debug.isDebug) {
			System.out.println("************ 出错: 线程 " + subThread
					+ " 跳转错误 ************");
		}
		JOptionPane.showMessageDialog(null, "下载文件 " + task.getFileUrl()
				+ " 的第 " + subThread.getPart() + " 个线程出错!", "错误",
				JOptionPane.ERROR_MESSAGE);
	}

	public void run() {
		task.setTotalBytes(FileHelper.getFileLength(task.getFileUrl())); // 设置总长度
		task.setStartMillis(Calendar.getInstance().getTimeInMillis()); // 设置开始下载时间
		int partLen = task.getTotalBytes() / task.getThreadCount(); // 每部分的长度

		if (partLen == 0) { // 如果下载的文件字节数比线程数目还小,则使用一个线程
			task.setThreadCount(1);
		}
		if (Debug.isDebug) {
			System.out.println("当前使用 " + task.getThreadCount() + " 个线程下载,"
					+ "每部分大小为 " + partLen + " 字节!");
		}
		// 每个任务都开辟task.getThreadCount()个子线程
		for (int i = 0; i < task.getThreadCount(); i++) {
			int startPos = i * partLen;
			int endPos = (i == task.getThreadCount() - 1) ? task
					.getTotalBytes() : (startPos + partLen);
			if (Debug.isDebug) {
				System.out.println(new File(task.getSavePath()).getName()
						+ " 线程 " + i + " 的任务:从 " + (startPos + 1) + " 到 "
						+ endPos + " 字节。");
			}
			// ThreadGroup tg = new ThreadGroup("SubThreads");
			SubTaskThread sth = new SubTaskThread(this, startPos, endPos, i);
			subThreads.add(sth);
			sth.addObserver((MainAppFrame)task.getMainFrame());
			new Thread(sth).start();
		}
	}
}

⌨️ 快捷键说明

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