多线程学习笔记
多线程学习笔记
这是一篇关于多线程相关的一些学习笔记
继承Thread类
1、子类继承Thread类具备多线程能力
2、启动线程: 子类对象. start()
3、不建议使用:避免OOP单继承局限性
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//总结:线程开启不是立即执行,由CPU调度。
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码--"+i);
}
}
public static void main(String[] args) {
//main线程,主线程
TestThread1 testThread1 = new TestThread1();
//调用start方法开启线程
testThread1.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在学习多线程"+i);//同时进行,交替进行
}
}
}
实现Runnable接口
1、实现接口Runnable具有多线程能力
2、启动线程: 传入目标对象+Thread对象.start()
3、推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用
public class TestThread4 implements Runnable{
//票数
private int ticketNums = 10;
@Override
public void run() {
while(true){
if(ticketNums<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票");
}
}
public static void main(String[] args) {
TestThread4 testThread4 = new TestThread4();
new Thread(testThread4,"小明").start();
new Thread(testThread4,"小王").start();
new Thread(testThread4,"黄牛").start();
}
}
public class TestThread5 implements Runnable{
private String winner;
@Override
public void run() {
for (int i = 0; i <=100; i++) {
boolean falg= over(i);
if(falg){
break;
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
}
}
private boolean over(int step){
if(winner!=null){
return true;
}
if(step==100){
winner = Thread.currentThread().getName();
System.out.println("winner is"+winner);
return true;
}
return false;
}
public static void main(String[] args) {
TestThread5 testThread5 = new TestThread5();
new Thread(testThread5,"兔子").start();
new Thread(testThread5,"乌龟").start();
}
}
实现Callable接口(了解即可)
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务: ExecutorService ser = Executors.newFixedThreadPool(1);
5.提交执行:Future result1 = ser.submit(t1);
6.获取结果: boolean r1 = result1.get()
7.关闭服务: ser.shutdownNow();
//实现Callable接口
public class TestThread6 implements Callable {
private String url;
private String name;
public TestThread6(String url,String name){
this.url=url;
this.name=name;
}
//下载图片执行体
@Override
public Boolean call(){
Webdownload webdownload = new Webdownload();
webdownload.download(url,name);
System.out.println("下载文件名为"+name);
return true;
}
public static void main(String[] args) throws ExecutionException,InterruptedException {
TestThread6 testThread1 = new TestThread6("https://cn.bing.com/","1.jpg");
TestThread6 testThread2= new TestThread6("https://cn.bing.com/","2.jpg");
TestThread6 testThread3 = new TestThread6("https://cn.bing.com/","3.jpg");
//创建执行服务
ExecutorService ser = Executors.newFixedThreadPool(3);
//提交执行
Future<Boolean> r1 = ser.submit(testThread1);
Future<Boolean> r2 = ser.submit(testThread2);
Future<Boolean> r3 = ser.submit(testThread3);
//获取结果
boolean rs1 = r1.get();
boolean rs2 = r2.get();
boolean rs3 = r3.get();
//打印
System.out.println(rs1);
System.out.println(rs2);
System.out.println(rs3);
//关闭服务
ser.shutdownNow();
}
}