继承Thread类
1.继承Thread类
2.重写run()方法
3.调用star方法
public class TestThread1 extends Thread{
@Override
public void run() {
for(int i=0;i<200;i++){
System.out.println("bbbbbbbb");
}
}
public static void main(String[] args) {
TestThread1 thread=new TestThread1();
thread.start();
for (int i=0;i<200;i++){
System.out.println("aaaaaaaaaaa");
}
}
}
实现Runnable接口
1.实现Runnable接口,重写run方法
2.创建当前类的对象
3.创建Thread类对象,使用Runnable接口构造方法
4.调用start方法
public class TestThread3 implements Runnable{
@Override
public void run() {
for(int i=0;i<200;i++){
System.out.println("bbbbbbbb");
}
}
public static void main(String[] args) {
TestThread3 thread3 = new TestThread3();
new Thread(thread3).start();
for (int i=0;i<200;i++){
System.out.println("aaaaaaaaaaa");
}
}
}
好处:可以多个线程公用一个对象
实列:模拟抢票软件
public class TestThread4 implements Runnable{
private int ticketname=10;
@Override
public void run() {
while(true){
if(ticketname<=0) break;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"抢到了第"+ticketname--+"张票");
}
}
public static void main(String[] args) {
TestThread4 thread4 = new TestThread4();
new Thread(thread4,"张三").start();
new Thread(thread4,"李四").start();
new Thread(thread4,"王五").start();
}
}
实现Callable接口
1.重写call方法
2.打开服务和线程池
3.将Callable接口扔进线程池
4.关闭服务
实列:多线程同时下载网络图片
public class TestCallable implements Callable{ private String name; private String url; public TestCallable(String url, String name) { this.name = name; this.url = url; } @Override public Boolean call() throws Exception { Webloader load =new Webloader(); load.WebDownloader(name,url); System.out.println(Thread.currentThread().getName()+"下载完成了"); return true; } public static void main(String[] args) { TestCallable t1= new TestCallable("https://img0.baidu.com/it/u=53211142,3579082837&fm=26&fmt=auto","白熊.jpg"); TestCallable t2= new TestCallable("https://img2.baidu.com/it/u=1868254201,2187725343&fm=26&fmt=auto","棕熊.jpg"); TestCallable t3= new TestCallable("https://img1.baidu.com/it/u=1615031516,635347996&fm=26&fmt=auto","胖达.jpg"); ExecutorService ser = Executors.newFixedThreadPool(3); Future r1 = ser.submit(t1); Future r2 = ser.submit(t2); Future r3 = ser.submit(t3); ser.shutdown(); } } class Webloader{ public void WebDownloader(String name,String url){ try { FileUtils.copyURLToFile(new URL(url),new File(name)); } catch (IOException e) { e.printStackTrace(); } } }
好处:有返回值



