Java一共有三种方式来创建和启动线程
1.继承Java.lang.Thread类,并覆盖run() 方法
2.实现Java.lang.Runnable接口,并实现run() 方法
3.实现Callable接口
注意:
1.新建的线程不会自动开始运行,必须通过start( )方法启动
2.不能直接调用run()来启动线程,这样run()将作为一个普通方法立即执行,执行完毕前其他线
程无法兵法执行
3.Java程序启动时,会立刻创建主线程,main就是在这个线程上运行。当不再产生新线程时,
程序是单线程的
一、继承Java.lang.Thread类
public class TestThread extends Thread {//自定义类继承Thread类
//run()方法里是线程体
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(this.getName() + ":" + i);//getName()方法是返回线程名称
}
}
public static void main(String[] args) {
TestThread thread1 = new TestThread();//创建线程对象
thread1.start();//启动线程
TestThread thread2 = new TestThread();
thread2.start();
}
}
二、实现Java.lang.Runnable接口,并实现run() 方法(推荐)
public class TestThread2 implements Runnable {//自定义类实现Runnable接口;
//run()方法里是线程体;
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
//创建线程对象,把实现了Runnable接口的对象作为参数传入;
Thread thread1 = new Thread(new TestThread2());
thread1.start();//启动线程;
Thread thread2 = new Thread(new TestThread2());
thread2.start();
}
}
三、实现Callable接口(了解)
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 了解创建线程的方式三:
*
*
*/
public class CDownloader implements Callable<Boolean>{
private String url; //远程路径
private String name; //存储名字
public CDownloader(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public Boolean call() throws Exception {
WebDownloader wd =new WebDownloader();
wd.download(url, name);
System.out.println(name);
return true;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
CDownloader cd1 =new CDownloader("http://upload.news.cecb2b.com/2014/0511/1399775432250.jpg","phone.jpg");
CDownloader cd2 =new CDownloader("http://p1.pstatp.com/large/403c00037462ae2eee13","spl.jpg");
CDownloader cd3 =new CDownloader("http://5b0988e595225.cdn.sohucs.com/images/20170830/d8b57e0dce0d4fa29bd5ef014be663d5.jpeg","success.jpg");
//创建执行服务:
ExecutorService ser=Executors.newFixedThreadPool(3);
//提交执行:
Future<Boolean> result1 =ser.submit(cd1) ;
Future<Boolean> result2 =ser.submit(cd2) ;
Future<Boolean> result3 =ser.submit(cd3) ;
//获取结果:
boolean r1 =result1.get();
boolean r2 =result1.get();
boolean r3 =result1.get();
System.out.println(r3);
//关闭服务:
ser.shutdownNow();
}
}
小结:
继承Thread类方式的多线程:
• 优势:编写简单
• 劣势:无法继承其它父类
实现Runnable接口方式的多线程:
• 优势:可以继承其它类,多线程可共享同一个Runnable对象
• 劣势:编程方式稍微复杂,如果需要访问当前线程,需要调用Thread.currentThread()方
法
实现Runnable接口方式要通用一些。