大家好,今天分享.使用Runnable接口创建线程
首先Java创建线程可以通过三种方法:
即:
1.继承Thread类创建线程类(重点)
2.通过Runnable接口创建线程类(重点)
3.通过Callable接口(了解即可)
今天,使用Runnable接口创建线程。
步骤:
1.定义MyRunnable类实现.Runnable接口
2.创建run()方法,编写线程执行体
3.创建线程对象,调用start()方法启动线程
package Demo01;
public class Thread03 implements Runnable{
// 创建线程的第二种方式:
//
// 1.实现Runnable接口
//2.重写run()方法,编写线程执行体
//3.创建线程对象,调用start()方法启动线程
public void run() {
//run方法线程体
for (int i = 0; i < 400; i++) {
System.out.println("我在吃饭"+i); //输出的信息
}
}
public static void main(String[] args) { //这里是主线程
Thread03 thread03 =new Thread03(); //创建Runnable接口的实现类对象
Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程
thread.start(); //开启线程
for (int i = 0; i < 300; i++) {
System.out.println("多线程"+i);
}
}
}
它的执行结果:
解释:
1.它的执行结果和 Thread继承的效果是一样的
2.调用start()方法启动线程: 结果就是线程以交替同时启动
这里还有注意点:
这两行代码(注意)
// Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程
// thread.start(); //开启线程
它等效于下面这一行代码:
new Thread(thread03).start();
整体代码在下面:
package Demo01;
public class Thread03 implements Runnable{
// 创建线程的第二种方式:
//
// 1.实现Runnable接口
//2.重写run()方法,编写线程执行体
//创建线程对象,调用start()方法启动线程
public void run() {
//run方法线程体
for (int i = 0; i < 400; i++) {
System.out.println("我在吃饭"+i); //输出的信息
}
}
public static void main(String[] args) { //这里是主线程
Thread03 thread03 =new Thread03(); //创建Runnable接口的实现类对象
// Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程
// thread.start(); //开启线程
new Thread(thread03).start(); //它等效上面两行被注释掉的代码
for (int i = 0; i < 300; i++) {
System.out.println("多线程"+i);
}
}
}
这是它的执行结果:(它是一样的效果)
它是一样的效果
下面我们使用Runnable接口的方式来实现之前的Thread实现下载图片:
看源码:
package Demo02;
import org.apache.commons.io.FileUtils;
import javax.imageio.IIOException;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class ThreadTest implements Runnable { //这一行要注意
private String url;
private String name;
public ThreadTest(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);
}
public static void main(String[] args) {
ThreadTest k1 = new ThreadTest("https://img-home.csdnimg.cn/images/20220218094038.jpg ", "1.jpg");
ThreadTest k2 = new ThreadTest("https://img-home.csdnimg.cn/images/20220218094038.jpg ", "2.jpg");
ThreadTest k3 = new ThreadTest("https://img-home.csdnimg.cn/images/20220218094038.jpg ", "3.jpg");
new Thread(k1).start(); //这是我们改动的地方
new Thread(k2).start();
new Thread(k3).start();
}
}
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异常,downloader方法异常");
}
}
}
看结果:
就是这样的
总结:
继承Thread 类
子类继承Thread类具有多线程能力
启动线程: 子类对象.start()
不建议使用:
OOP单继承有局限性
实现接口Runnable具有多线程能力
启动线程:传入目标对象+Thread对象.start ()
推荐使用:避免单继承局限性,灵活方便,方便同一对象被多个线程使用
好了,有关于使用Runnable接口创建线程就到这里了,谢谢大家