实现方式
继承Thread
public class ThreadTest extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
ThreadTest t1 = new ThreadTest();
ThreadTest t2 = new ThreadTest();
ThreadTest t3 = new ThreadTest();
t1.start();
t2.start();
t3.start();
}
}
实现Runnable接口
public class RunnableTest implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
RunnableTest r1 = new RunnableTest();
RunnableTest r2 = new RunnableTest();
RunnableTest r3 = new RunnableTest();
new Thread(r1).start();
new Thread(r2).start();
new Thread(r3).start();
}
}
通过Callable、ExecutorService、Future创建
public class CallableTest implements Callable<Object> {
@Override
public Object call(){
System.out.println(Thread.currentThread().getName());
return null;
}
public static void main(String[] args) {
CallableTest c1 = new CallableTest();
CallableTest c2 = new CallableTest();
CallableTest c3 = new CallableTest();
//创建执行服务
ExecutorService service = Executors.newFixedThreadPool(3);
//提交执行
Future f1 = service.submit(c1);
Future f2 = service.submit(c2);
Future f3 = service.submit(c3);
//关闭服务
service.shutdownNow();
}
}
区别
Thread
Thread是通过继承实现的,java是单继承,所以如果需要继承其他类这种方法就不合适。Thread底层也实现了Runnable接口
Runnable
Runnable是一个接口,java中可以实现多个接口,不影响程序的扩展。Thread类提供了一个方法可以接收Runnable类型的参数并执行。
Callable
Callable最大的不同就是执行结果有返回值。
多线程实现下载
public class ThreadTest extends Thread{
private String url;
private String name;
public ThreadTest(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public void run() {
try {
downloader(url,name);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("下载了文件名为:"+name);
}
//下载的方法
public void downloader(String url,String name) throws Exception {
FileUtils.copyURLToFile(new URL(url),new File(name));
}
//测试
public static void main(String[] args) throws Exception {
ThreadTest t1 = new ThreadTest("需要下载的资源地址","1.jpg");
ThreadTest t2 = new ThreadTest("需要下载的资源地址","2.jpg");
ThreadTest t3 = new ThreadTest("需要下载的资源地址","3.jpg");
t1.start();
t2.start();
t3.start();
}
}