首页 > 其他分享 >线程的三种创建方式

线程的三种创建方式

时间:2024-01-29 19:25:31浏览次数:23  
标签:线程 Thread int 创建 三种 println new public

 1 //    方式一:继承Thread类
 2 public class Thread{
 3     public static void main(String[] args) {
 4         Thread t = new MyThread();
 5         t.start();
 6 
 7         for (int i = 0; i < 5; i++) {
 8             System.out.println("主线程:" + i);
 9         }
10     }
11 }
12 
13 public class MyThread extends Thread {
14     @Override
15     public void run(){
16         for (int i = 0; i < 5; i++) {
17             System.out.println("子线程:" + i);
18         }
19     }
20 }
 1  /*
 2     创建线程方式二、实现 Runnable接口
 3 */
 4 public class ThreadDemo2 {
 5     public static void main(String[] args) {
 6         Runnable r = new MyRunnable();
 7         Thread t = new Thread(r);
 8         t.start();
 9         for (int i = 0; i < 5; i++) {
10             System.out.println("主线程:" + i);
11         }
12     }
13 }
14 
15 public class MyRunnable implements Runnable {
16     @Override
17     public void run() {
18         for (int i = 0; i < 5; i++) {
19             System.out.println("任务线程:" + i);
20         }
21     }
22 }
public class ThreadDemo2_mini {
    /*
        线程创建方式二 、实现Runnable接口(匿名内部类方式)
     */
    public static void main(String[] args) {

        Runnable r = new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("子线程1:" + i);
                }
            }
        };
        Thread t = new Thread(r);
        t.start();

        //  同上简化
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.println("子线程2:" + i);
                }
            }
        }).start();

        //  同上简化
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("子线程3:" + i);
            }
        }).start();


        for (int i = 0; i < 5; i++) {
            System.out.println("主线程:" + i);
        }
    }
}
/*
    方式三:实现Collable接口
*/
public class ThreadDemo3 {
    public static void main(String[] args) {
        //  创建 Callable 任务对象
        //  线程1
        Callable<String> call = new MyCallable(50);
        //  把 Callable 任务对象 交给 FutureTask 对象
        //  FutureTask 对象作用 1:是 Runnable 的对象 (实现了 Runnable 接口),可以交给 Thread
        //  FutureTask 对象作用 2: 可以在线程执行完毕之后通过调用 get 方法得到线程执行完成的结果
        FutureTask<String> task = new FutureTask<>(call);
        //  交给线程
        Thread t = new Thread(task);
        //  启动线程
        t.start();

        //  线程 2
        Callable<String> call2 = new MyCallable(100);
        FutureTask<String> task2 = new FutureTask<>(call2);
        Thread t2 = new Thread(task2);
        t2.start();

        //  获取线程执行完的结果
        try {
            //  如果任务没有执行完毕这里会先等待,等任务执行完之后在提取结果
            String s = task.get();
            System.out.println("线程1:" + s);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            //  如果任务没有执行完毕这里会先等待,等任务执行完之后在提取结果
            String s2 = task2.get();
            System.out.println("线程2:" + s2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class MyCallable implements Callable<String> {
    /*
        定义一个任务类、实现 Callable 接口、应申明线程结束后的结果类型
     */
    private int n;
    public MyCallable(int n){
        this.n = n;
    }

    //  重写 call 方法
    @Override
    public String call() throws Exception {
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum += i;
        }
        return "子线程结果是:" + sum;
    }
}

 

标签:线程,Thread,int,创建,三种,println,new,public
From: https://www.cnblogs.com/dsds/p/17995142

相关文章

  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--创建字符子集
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewerPdfium.Net.Free一个免费的Pdfium的.net包装器--加载字体 接上篇,怎么创建字符子集呢?获取字符集内的字形符号需要引用wpf下PresentationCore.dll,根据比对传入......
  • java用多线程批次查询大量数据(Callable返回数据)方式
    我看到有的数据库是一万条数据和八万条数据还有十几万条,几百万的数据,然后我就想拿这些数据测试一下,发现如果用java和数据库查询就连一万多条的数据查询出来就要10s左右,感觉太慢了。然后网上都说各种加索引,加索引貌似是有查询条件时在某个字段加索引比较快一些,但是毕竟是人家的库不......
  • 线程分批处理数据及MyBatis的批量插入
    文章目录一、背景二、代码实现:三、分页查询下游批次处理场景四、MyBatis的批量插入1、活动表简单表结构:2、业务层组装数据:一、背景数据量较多时,我们常常遇到需要分批处理的情况,比如上千上万数据需要需要操作数据库时(入库或者更新),我们想到分批处理,或者解析文件数据量较多,我......
  • 线程安全问题
    需求:某电影院目前正在上映国产大片,共100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票publicclassMyThreadextendsThread{//表示这个类的所有对象都共享ticketstaticintticket=0;//0~99@Overridepublicvoidrun(){while(true){if(tic......
  • 创建linux桌面快捷方式
    第一步在linux桌面上创建一个xx.desktop文件,如下图第二步在desktop文件中输入启动命令和参数,保存文件[DesktopEntry] Encoding=UTF-8 Name=SQLDeveloper Comment=OracleSQLDeveloper Icon=/opt/sqldeveloper/icon.png Exec=/opt/sqldeveloper/sqldeveloper.sh Term......
  • 线程池参数千万不要这样设置,坑得我整篇文章都写错了,要注意!
    你好呀,我是歪歪。先给大家道个歉:上周不是发布了这篇文章嘛:《三个烂怂八股文,变成两个场景题,打得我一脸懵逼。》其中第一个关于线程池的场景,经过读者提醒可能有问题,我又一次用尽浑身解数分析了一波,发现之前确实分析的不对。这个案例真的是再一次深入的刷新了我对于线程池运行过......
  • 在Python的Tkinter库中,`ttk.Combobox`是一个组合框控件,它允许用户从下拉列表中选择一
    在Python的Tkinter库中,`ttk.Combobox`是一个组合框控件,它允许用户从下拉列表中选择一个选项,也可以让用户输入内容。以下是一些主要的参数和方法:1.**创建Combobox**¹²:  ```python  importtkinterastk  importtkinter.ttkasttk  root=tk.Tk()  ......
  • 在Tkinter中,`Frame`的大小可以通过多种方式进行调整: 1. **设置宽度和高度**:在创建`Fr
    在Tkinter中,`Frame`的大小可以通过多种方式进行调整:1.**设置宽度和高度**:在创建`Frame`时,可以直接设置其宽度(`width`)和高度(`height`)¹⁴。例如:  ```python  frame=tk.Frame(root,width=200,height=100)  frame.pack()  ```2.**自适应窗口大小**:可以使......
  • 深入浅出Java多线程(二):Java多线程类和接口
    引言大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第二篇内容:Java多线程类和接口。大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!!在现代计算机系统中,多线程技术是提升程序性能、优化资源利用和实现并发处理的重要手段。特别是在Java编程语言中,多线程机......
  • TopShelf创建服务
    TopShelf创建Windows服务安装NuGet包TopShelf如图1-1所示,先安装TopShelf的NuGet包;图1-1创建服务类如图1-2所示,创建一个ServiceManager服务类,并创建了两个方法,分别为Start和Stop方法,分别在服务启动和停止时调用;图2-1使用TopShelf创建服务如图3-1所示,在Program.cs文件中对......