📄 taskthread.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 + -