大家好,今天分享.使用Runnable接口创建线程
首先Java创建线程可以通过三种方法:即:
继承Thread类创建线程类通过Runnable接口创建线程类通过Callable接口
今天,使用Runnable接口创建线程。
步骤:
定义MyRunnable类实现.Runnable接口创建run()方法,编写线程执行体创建线程对象,调用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);
}
}
}
它的执行结果:
解释:它的执行结果和Thread继承的效果是一样的
调用start方法启动线程:结果就是线程以交替同时启动
这里还有注意点:
这两行代码
// Thread thread =new Thread(thread03); //创建线程对象,通过线程对象来启动线程
// thread.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接口创建线程就到这里了,谢谢大家
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点