java创建多线程的几种方法

线程和进程

进程:执行的应用程序。

线程:进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

线程调度

分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。

抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。

用户可在任务管理器中的详细信息列表设置线程的优先级

创建多线程程序 =>继承thread/实现Runnable/实现Callable(线程池)

创建多线程程序的第一种方式:继承thread类
java.lang.Thread:就是一个描述线程的类,类想实现多线程,就必须继承Thread类
线程是程序中执行的线程。 Java虚拟机允许应用程序同时运行多个执行线程。

java程序属于抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个线程执行(线程随机性)

  1. 创建Thread类的子类,继承Thread类
  2. 在Thread类的子类中,重写Thread类的run方法,设置线程任务(开启新的线程的目的
  3. 创建一个对象
  4. 调用start函数
public class ThreadDemo extends Thread{
    //2.在Thread类的子类中,重写Thread类的run方法,设置线程任务(开启新的线程的目的)

    @Override
    public void run() {
        //新线程执行run方法
        for (int i = 0; i < 20; i++) {
            System.out.println("run-->"+i);
        }
    }
    
     public static void main(String[] args) {
        //3.创建Thread类的子类对象
        ThreadDemo t1 = new ThreadDemo();
        //t1.run(); 不会开启新线程,只有主线程,会顺序执行
         //4.调用start函数,主线程和子线程交替运行
        t1.start();
        //main线程,即主线程
        for (int i = 0; i < 20; i++) {
            System.out.println("main-->"+i);
        }
    }
    
}

创建多线程程序的第二种方式:实现Runnable接口
java.lang.Runnable
Runnable接口应由任何其实例由线程执行的类实现。 该类必须定义一个名为run的无参数的方法。

java.lang.Thread类的构造方法:

Thread(Runnable target) 分配新的 Thread对象。
Thread​(Runnable target, String name) 分配新的 Thread对象。
实现步骤

1:创建一个类实现Runnable接口
2:重写Runnable接口中的run方法,设置线程任务
3:创建Runnable接口的实现类对象
4:创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5:调用Thread类中的start方法,开启新线程,执行run方法

//1.创建一个类实现Runnable接口
public class RunnableImpl implements Runnable {
    //2.重写Runnable接口中的run方法,设置线程任务
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+"-->"+i);
        }
    }
}

public class Demo01 {
    public static void main(String[] args) {
        //3.创建Runnable接口的实现类对象
        RunnableImpl r = new RunnableImpl();
        //4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
        Thread t = new Thread(r);
        //5.调用Thread类中的start方法,开启新线程,执行run方法
        t.start();
		//new Thread(r,rname).start;
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName()+"-->"+i);
        }
    }
}

创建多线程程序的第三种方式:实现Callable接口

该类必须定义一个名为call的无参数的方法。(需要抛异常)

实现步骤

1:创建一个类实现Callable接口(需要有返回值)
2:重写Callable接口中的call方法,设置线程任务(需要抛异常)
3:创建Callable接口的实现类对象
4:创建Executors创建线程池,分配线程池数量
5:提交执行
6:获取结果

public class CallableThread implements Callable<Boolean> {
    String url;
    String name;

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

    @Override
    public Boolean call() throws Exception {
        DownloadUrl(url, name);
        System.out.println("下载了" + name);
        return true;
    }

    //主线程
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CallableThread t1 = new CallableThread("https://gitee.com/AsteroidQiao/library-management-system/raw/master/book-avatar/1697097432990%E6%88%90%E5%A4%A7%E4%BA%8B.jpg", "成大事1.jpg");
        CallableThread t2 = new CallableThread("https://gitee.com/AsteroidQiao/library-management-system/raw/master/book-avatar/1697097856718@%E6%88%90%E6%9E%9C%E6%88%90%E6%9E%9C%E6%88%90%E7%8B%97%20%E7%9A%84%E4%B8%AA%E4%BA%BA%E4%B8%BB%E9%A1%B5%20-%20%E5%BE%AE%E5%8D%9A_d3721ec7.jpg", "成果1.jpg");
        CallableThread t3 = new CallableThread("https://gitee.com/AsteroidQiao/library-management-system/raw/master/book-avatar/1697097590301%E7%8E%8B%E6%99%A8%E9%98%B3.jpg", "王晨阳1.jpg");
        //创建线程池,数量为3
        ExecutorService eService = Executors.newFixedThreadPool(3);
        // 提交执行
        Future<Boolean> result1 = eService.submit(t1);
        Future<Boolean> result2 = eService.submit(t2);
        Future<Boolean> result3 = eService.submit(t3);
        // 获取结果
        boolean r1 = result1.get();
        boolean r2 = result2.get();
        boolean r3 = result3.get();
        System.out.println("r1的值:"+r1+"r2的值:"+r2);
        eService.shutdown();
    }

    //class WebDownloader
    //创建一个下载器
    public static void DownloadUrl(String url, String name) {
        try {
            FileUtils.copyURLToFile(new URL(url), new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常");
        }
    }
}
posted @ 2023-10-17 09:50  AsteroidQiao  阅读(590)  评论(0)    收藏  举报