目录
一、多线程
1.1 Thread
1.1.1 Thread 类常用的方法
1.1.2 Thread 介绍
1.1.3 练习:开启多线程同时下载图片
1.2 Runnable
一、多线程
1.1 Thread
1.1.1 Thread 类常用的方法
| 方法名 | 作用 |
|---|---|
| currentThread() | 静态⽅法,返回对当前正在执⾏的线程对象的引⽤; |
| start(): | 开始执⾏线程的⽅法,java虚拟机会调⽤线程内的run()⽅法; |
| yield(): | yield在英语⾥有放弃的意思,同样,这⾥的yield()指的是当前线程愿 意让出对当前处理器的占⽤。这⾥需要注意的是,就算当前线程调⽤了yield() ⽅法,程序在调度的时候,也还有可能继续运⾏这个线程的; |
| sleep() | 静态⽅法,使当前线程睡眠⼀段时间 |
| join() | 使当前线程等待另⼀个线程执⾏完毕之后再继续执⾏,内部调⽤的是 Object类的wait⽅法实现的 |
1.1.2 Thread 介绍
当类继承 Thread 类后,该类在新建实例时便成为了一个线程类。重写 Thread 类中的Run() 方法后 方法体内代码就是新线程所执行的。
public class NewThread extends Thread {
@Override
public void run() {
// run 方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("新建线程内for循环执行的次数:" + i);
}
}
}
在主线程使用该线程类实例的run() 方法后,会先执行完 run() 方法完毕后再继续执行。但使用stare() 方法时,感觉会同步进行,但并不是 就像你边吃饭边玩手机 你的心思不可能分开 吃饭的时候总有一点心思放在饭上。
public static void main(String[] args) {
// main 线程 主线程
NewThread newThread = new NewThread();
newThread.start();
for (int i = 0; i < 2000 ; i++){
System.out.println("主线程内for循环执行的次数:"+ i);
}
}
执行结果:
主线程内for循环执行的次数:532
新建线程内for循环执行的次数:0
主线程内for循环执行的次数:533
新建线程内for循环执行的次数:1
主线程内for循环执行的次数:534
新建线程内for循环执行的次数:2
主线程内for循环执行的次数:535
新建线程内for循环执行的次数:3
主线程内for循环执行的次数:536
新建线程内for循环执行的次数:4
总结 : 线程开启不一定立即执行,由Cpu 调度执行
1.1.3 练习:开启多线程同时下载图片
package com.quehaobo.ThreadTask;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.net.URL;
public class TestThread extends Thread {
private String Name;
private String Url;
public TestThread(String name, String url) {
Name = name;
Url = url;
}
@Override
public void run() {
new WebDownLoader().DownLoader(Url,Name);
System.out.println("执行完毕"+ Name );
}
public static void main(String[] args) {
new TestThread("1.png","https://static.hdslb.com/error/very_sorry.png").start();
new TestThread("2.png","https://static.hdslb.com/error/very_sorry.png").start();
new TestThread("3.png","https://static.hdslb.com/error/very_sorry.png").start();
}
}
//下载器
class WebDownLoader {
public void DownLoader(String url,String Name){
try {
FileUtils.copyURLToFile(new URL(url),new File(Name));
} catch (Exception e) {
System.out.println("IO 异常 ------ n" +
"DownLoader() 报错 ;n" +
"Error:" + e.getMessage());
}
}
}
1.2 Runnable
package com.quehaobo.ThreadTask;
public class RunnableTask implements Runnable{
// 主线程
public static void main(String[] args) {
// 运行新建的线程
new Thread(new RunnableTask()).start();
//主线程内的方法
for (int i = 0; i < 2000 ; i++){
System.out.println("主线程内for循环执行的次数:"+ i);
}
}
@Override
public void run() {
// 线程方法体
for (int i = 0; i < 20 ; i++){
System.out.println("新建线程内for循环执行的次数:"+ i);
}
}
}
运行结果:
主线程内for循环执行的次数:444
新建线程内for循环执行的次数:1
主线程内for循环执行的次数:445
新建线程内for循环执行的次数:2
主线程内for循环执行的次数:446
新建线程内for循环执行的次数:3
package com.quehaobo.ThreadTask;
public class RunnableTask implements Runnable{
// 主线程
public static void main(String[] args) {
// 运行新建的线程
new Thread(new RunnableTask()).start();
//主线程内的方法
for (int i = 0; i < 2000 ; i++){
System.out.println("主线程内for循环执行的次数:"+ i);
}
}
@Override
public void run() {
// 线程方法体
for (int i = 0; i < 20 ; i++){
System.out.println("新建线程内for循环执行的次数:"+ i);
}
}
}
运行结果:
主线程内for循环执行的次数:444
新建线程内for循环执行的次数:1
主线程内for循环执行的次数:445
新建线程内for循环执行的次数:2
主线程内for循环执行的次数:446
新建线程内for循环执行的次数:3
使用Runnable 时 可以使用Thread 代理 实现一个对象执行多次操作;



