一共有以下三种方式:
1.继承Thread
2.实现Runnable
3.实现Callable,并FutureTask包装
线程启动方式均是使用start()方法
先阐述优缺点:
1和2,3:
2,3优于1是使用了借口,留出来了继承的位置
1优于2,3是使用简单,实现简单
2和3:
我认为3的实现比2更复杂一些,因为2的方法效果单一
但正所谓一分耕耘一份收获,程序也是如此
3的call()方法比2的run()多出两点功能:抛异常和返回值,
而且3能通过
FutureTask类的包装对该线程监控,控制,启用取消该线程。
以下给出1,2线程的简要创建方式:
//继承Thread
class a extends Thread{
//其他什么都不做用就new,start
}
//实现Runnable
class A implements Runnable{
//重写run方法,一般在其内添加死循环
//启动方式为
//新建
// A a=new A();
//Thread t=new Thread(a);
//t.start()
}
重点介绍第三种创建方式,
以前学的不全,现在重新归纳
注意:也只能创建一个线程,并不是包装后通过FutureTask能建立多个线程,它的作用主要是用于监控被包装的线程的状态,以及控制该线程
本人踩坑(以为能多创建)
直接上代码:
package com.j;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.*;
/**
* @author joker
* @version 1.0
* @description pdf转word
* @date 2020-03-01 -- 12:01
*/
class Th implements Runnable {
public boolean flag = true;
public void run() {
System.out.println("转换中");
while (true) {
if (!flag) {
System.out.println();
System.out.println("转换word成功!");
return;
}
System.out.print(".#");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class PDF {
public static void main(String[] args) {
try {
Th th = new Th();
new Thread(th).start();
String pdfFile = "D:\\360安全浏览器下载\\多媒体教材.pdf";
PDDocument doc = PDDocument.load(new File(pdfFile));
int pagenumber = doc.getNumberOfPages();
pagenumber=10;
pdfFile = pdfFile.substring(0, pdfFile.lastIndexOf("."));
String fileName = pdfFile + ".doc";
File file = new File(fileName);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(fileName);
Writer writer = new OutputStreamWriter(fos);
PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(true);// 排序
stripper.setStartPage(5);// 设置转换的开始页
stripper.setEndPage(pagenumber);// 设置转换的结束页
stripper.writeText(doc, writer);//写到word
writer.close();
doc.close();
th.flag=false;
} catch (IOException e) {
e.printStackTrace();
}
}
}
学海无涯
java基础有待提高!