创建线程的三个方式

方式一:

package ThreadTest.Day1;

/**
 * @author CCQ
 * 创建线程的方式一:继承Thread类,重写run()方法,通过start()方法调度,
 */
public class ThreadTest01 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 2000; i++) {
            System.out.println("线程1");
        }
    }

    public static void main(String[] args) {
        ThreadTest01 t= new ThreadTest01();
        t.start();
        for (int i = 0; i < 2000; i++) {
            System.out.println("2");
        }
    }
}

package ThreadTest.Day1;
/**
 * @author CCQ
 *  实现多线程同步下载图片
 *  用第一种方法实现多线程
 */

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

public class Test02 extends Thread{
    private String url;
    private String name;

    public Test02(String url,String name) {
        this.url =url;
        this.name =name;
    }

    @Override
    public void run() {
        Webdowmloader webdowmloader =new Webdowmloader();
        webdowmloader.dl(url,name);
        System.out.println("下载了文件名为:"+name);
    }

    public static void main(String[] args) {
        Test02 test1 =new Test02("https://huyaimg.msstatic.com/cdnimage/gamebanner/phpkKtyA71628563925.jpg","picture01.jpg");
        Test02 test2 =new Test02("https://huyaimg.msstatic.com/cdnimage/gamebanner/phpMQE5MQ1628825437.jpg","picture02.jpg");
        Test02 test3 =new Test02("https://huyaimg.msstatic.com/cdnimage/gamebanner/phpskpwN51594382541.jpg","picture03.jpg");
        test1.start();
        test2.start();
        test3.start();
    }
}

class Webdowmloader{
     /*
     FileUtils是commons库里面的一个类,里面的copyURLToFile方法可以将url传入到文件
      */
    public void dl(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("发生了异常!");
        }
    }
}

方式二:

package ThreadTest.Day1;

/**
 * 实现多线程方式2:实现Runnable接口
 *  创建实现类对象,将对象抛给Thread类对象调用start方法开启线程
 *  推荐用这一种方式实现,因为可以实现多个接口,第一种只能单继承
 */
public class Test03 {
    public static void main(String[] args) {
        test t =new test();
        new Thread(t).start();
        for (int i = 0; i < 2000; i++) {
            System.out.println("主线程");
        }
    }
}


class test implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 2000; i++) {
            System.out.println("线程2");
        }
    }
}
package ThreadTest.Day1;
/**
 * @author CCQ
 * 使用第二种实现多线程方式复制图片
 */

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;

public class test04 {
    public static void main(String[] args) {
        moret m1 =new moret("https://img2.baidu.com/it/u=2010459409,1898448625&fm=26&fmt=auto&gp=0.jpg","picture04.jpg");
        moret m2 =new moret("https://img2.baidu.com/it/u=3821804176,575877500&fm=26&fmt=auto&gp=0.jpg","picture05.jpg");
        moret m3 =new moret("https://img0.baidu.com/it/u=3950894203,3620641473&fm=26&fmt=auto&gp=0.jpg","picture06.jpg");
        new Thread(m1).start();
        new Thread(m2).start();
        new Thread(m3).start();
    }
}

class moret implements Runnable{
    private String url;
    private String name;

    public moret(String url, String name) {
        this.url = url;
        this.name = name;
    }

    @Override
    public void run() {
        Webdownload webdownload =new Webdownload();
        webdownload.dl(url,name);
        System.out.println("下载了文件"+name);
    }
}

class Webdownload{
    public void dl(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("出现异常了!");
        }
    }
}


方式三:

package ThreadTest.Day1;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;

/**
 * 线程实现的第三种方法,实现callable接口
 * 需要重写call()方法。并且需要返回值,返回值类型自己设置,但不能为基本数据类型,
 */
public class Test07 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        imt i1 =new imt("https://img2.baidu.com/it/u=2010459409,1898448625&fm=26&fmt=auto&gp=0.jpg","picture07.jpg");
        imt i2 =new imt("https://img2.baidu.com/it/u=3821804176,575877500&fm=26&fmt=auto&gp=0.jpg","picture08.jpg");
        imt i3 =new imt("https://img0.baidu.com/it/u=3950894203,3620641473&fm=26&fmt=auto&gp=0.jpg","picture09.jpg");

        //创建执行服务。
        ExecutorService service = Executors.newFixedThreadPool(3);

        //提交执行。
        Future<Boolean> r1 =service.submit(i1);
        Future<Boolean> r2 =service.submit(i2);
        Future<Boolean> r3 =service.submit(i3);

        //获取结果
        Boolean aBoolean = r1.get();
        Boolean aBoolean1 = r2.get();
        Boolean aBoolean2 = r3.get();
        System.out.println(aBoolean);
        System.out.println(aBoolean1);
        System.out.println(aBoolean2);
;        //关闭服务
        service.shutdownNow();
    }
}

class imt implements Callable<Boolean> {
    private String url;
    private String name;

    public imt(String url, String name) {
        this.url = url;
        this.name = name;
    }

    @Override
    public Boolean call(){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
            System.out.println("下载了文件:"+name);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程可以通过以下三种方式创建: 1. 实现Runnable接口,并实现run()方法。首先,自定义一个类并实现Runnable接口,然后在该类中实现run()方法。接下来,创建Thread对象,并将实现了Runnable接口的对象作为参数实例化该Thread对象。最后,调用Thread的start()方法来启动线程。这种方式的代码示例可以参考引用\[1\]中的代码。 2. 继承Thread类,重写run()方法。Thread类本质上也是实现了Runnable接口的一个实例,它代表了一个线程的实例。通过继承Thread类并重写run()方法,然后调用start()方法来启动线程。这种方式的代码示例可以参考引用\[2\]中的代码。 3. 使用匿名内部类实现多线程。可以直接在创建Thread对象时使用匿名内部类来实现多线程。这种方式可以简化代码,但只能使用一次。具体的代码示例可以参考引用\[3\]中的代码。 总结起来,多线程创建方式有实现Runnable接口、继承Thread类和使用匿名内部类。每种方式都有其适用的场景,可以根据具体需求选择合适的方式创建多线程。 #### 引用[.reference_title] - *1* *2* [初识多线程——创建多线程的三种方式](https://blog.csdn.net/pizssn/article/details/106382025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [多线程创建的三种方式](https://blog.csdn.net/qq_31780525/article/details/54338341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值