线程创建
三种创建方式:①Thread class 继承Thread类
②Runnable接口 实现(implement)Runnable接口,Thread类就是实现了Runnable接口
③Callable接口 实现Callable接口
Thread类
自定义线程类继承Thread类;重写run方法,编写程序执行体;创建线程对象,调用start方法启动线程。
package com.wang.thread;
//创建线程方式一:继承Thread类,重写run方法,调用start方法开启线程
public class ThreadDemo01 extends Thread{
线程开启不一定立即执行,由cpu调度执行
案例:用多线程同时下载几个图片
分析:下载图片首先需要一个下载器,所以先写一个下载器,在下载器中写下载方法,通过FileUtils工具类的方法copyURLToFile,把URL变成一个文件,参数需要一个url和name。
实现线程类,继承Thread类,变成线程类,在类中重写run方法,run方法就是线程的执行体。
创建三个线程,通过start将三个线程同时启
package com.practice.thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
//common.io是别人写好的,直接下载下来用
//练习thread,实现多线程同步下载图片
public class ThreadDemo01 extends Thread {
private String url;//网络图片地址
private String name;//保存的文件名
public ThreadDemo01(String url,String name){
this.url=url;
this.name=name;
}
实现Runnable
定义MyRunnable类实现Runnable接口;重写run方法,编写线程执行体;创建线程对象,调用start方法启动线程。
package com.wang.thread;
//创建线程方式二:实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口的实现类,调用start
public class RunnableDemo01 implements Runnable{
案例:用多线程同时下载几个图片
package com.practice.thread;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class RunnableDemo01 implements Runnable {
private String url;
private String name;
public RunnableDemo01(String url,String name){
this.url=url;
this.name=name;
}
实现Runnable接口,能避免单继承局限性,灵活方便,方面同一个对象被多个线程使用
多个线程操作同一个资源的情况下,线程不安全,数据紊乱,并发
package com.wang.thread;
//多个线程同时操作同一个对象
//买火车票的例子
//多个线程操作同一个资源的情况下,线程不安全,数据紊乱
public class RunnableDemo02 implements Runnable {
//票数
private int ticketNumbers=10;
案例:龟兔赛跑-Race
package com.practice.thread;
public class RaceDemo implements Runnable {
//胜利者
private static String winner;
实现Callable接口
1、实现Callable接口,需要返回值类型
2、重写call方法,需要抛出异常
3、创建目标对象
4、创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(1);
5、提交执行:Future<Boolean> result1=ser.submit(t1);
6、获取结果:boolean r1=result1.get();
7、关闭服务:ser.shutdownNow();
Callable的好处:可以定义返回值;可以抛出异常
package com.practice.thread;
import com.wang.duixiang.B;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;
/**
* 线程创建方式三:实现Callable接口
* 1、实现Callable接口,需要返回值类型
* 2、重写call方法,需要抛出异常
* 3、创建目标对象
* 4、创建执行服务:ExecutorService ser=Executors.newFixedThreadPool(1);
* 5、提交执行:Future <Boolean> result1=ser.submit(t1);
* 6、获取结果:boolean r1=result1.get();
* 7、关闭服务:ser.shutdownNow();
*/
public class CallableDemo01 implements Callable<Boolean> {
private String url;
private String name;
public CallableDemo01(String url,String name){
this.url=url;
this.name=name;
}