多线程
继承Thread类
package thread;
//创建线程方式一:继承thread类,重写run方法,调用start开启线程
public class TestThread extends Thread{ //自定义线程类 继承Thread类
多线程就是多条执行路径,主线程和子线程并行交替执行。线程开启不一定立即执行,由CPU统一调度。
网图下载
package thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class TestThread01 extends Thread{
private String url; //由下载器类可知,下载器中的方法需要得到两个变量的值,所以在大类定义这两个变量
private String name;
public TestThread01(String url,String name) {
this.url = url; //通过构造方法取得用户输入的这两个变量的值,url和name。使它们在程序中使用
this.name = name;
}
继承Runnable接口(常用)
package thread;
public class TestThread02 implements Runnable{ //继承后就会具有多线程能力,方便同一个对象被多个线程使用
private String url; //由下载器类可知,下载器中的方法需要得到两个变量的值,所以在大类定义这两个变量
private String name;
public TestThread02(String url,String name) {
this.url = url; //通过构造方法取得用户输入的这两个变量的值,url和name。使它们在程序中使用
this.name = name;
}
并发问题
package thread;
//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱,很多人抢票,可能同时拿到同一张票
public class TestThread03 implements Runnable{
private int tickets = 10;
龟兔赛跑
package thread;
public class Race implements Runnable{
private static String winner; //保证只有一个winner
线程创建方式:Callable接口实现
好处:可以定义返回值,可以抛出异常。需要创建服务。
package thread;
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<Boolean> { // Callable<>接口需要返回值,需要重写call方法,<>中的返回值类型和call的返回值类型一致,就可以了,都可以是Boolean。
private String url; //由下载器类可知,下载器中的方法需要得到两个变量的值,所以在大类定义这两个变量
private String name;
public TestCallable(String url,String name) {
this.url = url; //通过构造方法取得用户输入的这两个变量的值,url和name。使它们在程序中使用
this.name = name;
}