程序
进程
线程
多线程
并发
继承Thread
单继承局限性
实现Runnable接口
避免单继承局限性, 灵活 方便同一个对象被多个线程调用
实现Callable接口
package com.cyz.demo01;
?
public class TestThread1 extends Thread {
?
导入commons-io-2.6.jar
模拟同步下载图片
package com.cyz.demo01;
?
import org.apache.commons.io.FileUtils;
?
import java.io.File;
import java.io.IOException;
import java.net.URL;
?
?
//练习Thread 实现多线程同步下载图片
public class TestThread2 extends Thread {
?
private String url; //网络图片地址
private String name;//保存的文件名
?
?
public TestThread2(String url, String name){
this.url=url;
this.name=name;
}
?
//下载图片线程的执行体
实现Runnable接口
package com.cyz.demo01;
?
//方式2 实现Runnable接口, 重写run方法
//需要Thread代理
public class TestThread3 implements Runnable {
?
多个线程操作同一个对象
package com.cyz.demo01;
?
//有并发问题 同时会拿到相同的数字
public class TestThread4 implements Runnable {
?
//票数
private int ticketNums = 10;
?
@Override
public void run() {
while (true){
//延时
try {
Thread.sleep(200);
if (ticketNums <= 0){
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
?
System.out.println(Thread.currentThread().getName()+" 拿到了第"+ ticketNums-- +" 张票");
}
}
?
public static void main(String[] args) {
TestThread4 ticket = new TestThread4();
?
new Thread(ticket,"小名").start();
new Thread(ticket,"老师").start();
new Thread(ticket,"黄牛").start();
}
}
?
package com.cyz.demo01;
?
import sun.awt.windows.ThemeReader;
?
//模拟龟兔赛跑
public class Race implements Runnable {
?
//胜利者
private static String winner;
?
实现callable接口
重写call方法
可以定义返回值
可以抛出异常
package com.cyz.demo02;
?
import org.apache.commons.io.FileUtils;
?
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
?
public class TestCallable implements Callable {
private String url; //网络图片地址
private String name;//保存的文件名
?
?
public TestCallable(String url, String name){
this.url=url;
this.name=name;
}
?
//下载图片线程的执行体