02.多线程
学习笔记
Thread
三种创建方式
继承Thread类 重写run()方法,创建线程对象,调用start()启动线程
实现Runnable接口 实现run()方法,创建实现类对象,创建线程对象
实现Callable接口
(Thread实现了Runnable接口)
例:多线程下载图片
public class TestThread1 extends Thread{
private String url;
private String name;
public TestThread01(String url, String name) {
this.url = url;
this.name = name;
}
@Override
public void run() {
WebDownloader webDownloader=new WebDownloader();
webDownloader.downloader(url,name);
System.out.println("name"+name);
}
public static void main(String[] args) {
TestThread1 testThread01=new TestThread1("","1.jpg");
TestThread1 testThread02=new TestThread1("","2.jpg");
TestThread1 testThread03=new TestThread1("","3.jpg");
testThread01.start();
testThread02.start();
testThread03.start();
}
}
实现Runnable接口
public class ThreadDemo2 implements Runnable {
private int tickets=10;
@Override
public void run() {
while (true){
System.out.println(Thread.currentThread().getName()+tickets--);
if (tickets<=0){
break;
}
}
}
public static void main(String[] args) {
ThreadDemo2 threadDemo2=new ThreadDemo2();
new Thread(threadDemo2,"a").start();
new Thread(threadDemo2,"b").start();
}
}
commons-io
//下载器
class WebDownloader{
public void downloader(String url,String name){
try {
FileUtils.copyURLToFile(new URL(url),new File(name));
} catch (IOException e) {
e.printStackTrace();
System.out.println("IO异常,download方法出现异常");
}
}
}
静态代理
- 目标对象和代理对象实现相同接口
- 将目标对象作为参数放入代理对象的构造方法中
- 创建代理对象的实例,并将目标对象作为构造参数传入
- 代理对象调用实现接口的方法
λ表达式
- 适用于一个接口中只有一个方法
//(param)->expression/statement/{statements}
new Thread(()-> System.out.println("1"));
线程的五大状态和方法
状态
thread.getstate()
Thread.State
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
创建、运行、死亡
就绪:等待获得CPU资源
阻塞:sleep() 、wait()、同步锁定
方法
- setPriority():更改优先级,1-10,t1.setPriority()
- sleep():休眠,用于测试,不会释放锁,Thread.sleep(ms)
- join():插队,等待插队的线程终止,在其他线程中使用,VIP线程.join()
- yield():礼让 在run()方法中使用,Thread.yield()
- interrupt():中断(不用)
- isAlive():测试是否处于活动状态
不推荐使用JDK提供的stop()和destroy()方法,建议使用标志位来终止线程
//使用flag来停止线程
public class Threaddemo2 implements Runnable {
private boolean flag=true;
public static int num=10;
@Override
public void run() {
while (flag){
System.out.println(Thread.currentThread().getName());
}
}
public void stop(){
this.flag=false;
}
}
获取系统当前时间
Date date=new Date(System.currentTimeMillis());
守护线程
Thread t1=new Thread(threadDemo4);
t1.setDaemon(true);