首页 > 编程语言 >java----多线程

java----多线程

时间:2024-02-04 22:37:15浏览次数:32  
标签:run Thread void ---- 线程 new java 多线程

1.什么是线程和进程?

进程好比一个软件,线程好比软件中的一个功能。一个进程包含了多个线程,

举例:

比如360软件中木马查杀;买票的时候,火车站就是一个进程,各个窗口表示线程。

并行与并发之间的区别:

好比做饭吧,几个厨师分别同时做不同的食物 ------------------- 并行 --------------------------------------   在同一时刻,有多个指令在多个CPU上同时执行

一个人在做在做很多食物,不停地交换     ------------------------并发---------------------------------        在同一时刻,有多个指令在单个CPU上交替执行

之所以提出java多线程,就是为了提高它的运行效率

多线程的实例:

比如你每次更新王者荣耀,需要加载东西还要放出音乐。这就是两个线程

2.使用java语言进程多线程代码编写

使用Java语言编写多线程的方法一共有三种

第一种:通过继承类Thread

  • 方法名说明
    void run() 在线程开启后,此方法将被调用执行
    void start() 使此线程开始执行,Java虚拟机会调用run方法()

 

 

相关代码如下:

按照顺序依次编写相关代码

- 定义一个类MyThread继承Thread类
- 在MyThread类中重写run()方法
- 创建MyThread类的对象
- 启动线程

 public class thred01  extends Thread{
   public void run(){
        for (int i = 0; i <=10; i++) {
            System.out.println(getName()+"hello  world");
        }
    }

}

/**
* 第一种方式进行多线程
*/
thred01 t = new thred01();
thred01 t2 = new thred01();
thred01 t3 = new thred01();
t.setName("线程1");
t2.setName("线程2");
t3.setName("线程3");
t.start();
t2.start();
t3.start();

两个小问题

- 为什么要重写run()方法?

因为run()是用来封装被线程执行的代码

- run()方法和start()方法的区别?

run():封装线程执行的代码,直接调用,相当于普通方法的调用

start():启动线程;然后由JVM调用此线程的run()方法

显示效果:

2.第二种方法implements Runnable

方法名说明
Thread(Runnable target) 分配一个新的Thread对象
Thread(Runnable target, String name) 分配一个新的Thread对象

  • 实现步骤

    • 定义一个类MyRunnable实现Runnable接口

    • 在MyRunnable类中重写run()方法

    • 创建MyRunnable类的对象

    • 创建Thread类的对象,把MyRunnable对象作为构造方法的参数

    • 启动线程



public class myrun implements Runnable{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName()+"hello world"); } } } // myrun my = new myrun(); // Thread t = new Thread(my); // Thread t2 = new Thread(my); // t.setName("线程1"); // t2.setName("线程2"); // t.start(); // t2.start();

3.通过Callable接口来实现多线程

| 方法名                           | 说明                                               |
| -------------------------------- | -------------------------------------------------- |
| V call()                         | 计算结果,如果无法计算结果,则抛出一个异常         |
| FutureTask(Callable<V> callable) | 创建一个 FutureTask,一旦运行就执行给定的 Callable |
| V get()                          | 如有必要,等待计算完成,然后获取其结果             |

+ 定义一个类MyCallable实现Callable接口
+ 在MyCallable类中重写call()方法
+ 创建MyCallable类的对象
+ 创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法的参数
+ 创建Thread类的对象,把FutureTask对象作为构造方法的参数
+ 启动线程
+ 再调用get方法,就可以获取线程结束之后的结果。


public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        for (int i = 0; i < 100; i++) {
            System.out.println("跟女孩表白" + i);
        }
        //返回值就表示线程运行完毕之后的结果
        return "答应";
    }
}
public class Demo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //线程开启之后需要执行里面的call方法
        MyCallable mc = new MyCallable();

        //Thread t1 = new Thread(mc);

        //可以获取线程执行完毕之后的结果.也可以作为参数传递给Thread对象
        FutureTask<String> ft = new FutureTask<>(mc);

        //创建线程对象
        Thread t1 = new Thread(ft);

        String s = ft.get();
        //开启线程
        t1.start();

        //String s = ft.get();
        System.out.println(s);
    }
}

关于多线程的一些方法:

void setName(String name)                               将此线程的名称更改为等于参数name 
String getName()                                              返回此线程的名称
Thread currentThread()                                    返回对当前正在执行的线程对象的引用 

static void sleep(long millis)使当前正在执行的线程停留(暂停执行)       指定的毫秒数

final int getPriority() 返回此线程的优先级
final void setPriority(int newPriority) 更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10

 

 

void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出

 

标签:run,Thread,void,----,线程,new,java,多线程
From: https://www.cnblogs.com/hellotoworld/p/18007054

相关文章

  • 莫队算法
    简要介绍:莫队算法是先进行分块,然后按照分块来排序,然后对已知区间进行增减以达到所求区间,记录下答案,最后按照所询问的顺序进行输出答案。如对于已知区间[l,r]要求[l-1,r],[l-2,r],[l-3,r],[l-4,r],则将已知区间向左移,同时进行add添加操作;而对于要求[l,r+1],[l,r+2],[l,r+3],[l,r+......
  • C++ Primer 学习笔记 PartI C++基础
    Ch1开始略这一章包含控制流,条件,循环,注释,标准IO等内容。对于C语言/ACMC+STL中常见数值的内容不再赘述,仅总结较为不熟悉的内容。PartIC++基础CH2变量和基本类型2.1基本内置类型2.1.1算术类型2.1.1类型转换向unsigned赋超出范围的值,结果取余,对于signed,结果未定义。......
  • 《程序是怎样跑起来的》第二章
    在这一章中,首先作者向我们介绍了十进制和二进制,让我们得以了解什么是十进制和二进制,在介绍完之后,作者介绍了如何进行十进制和二进制的转换,其中十进制转换二进制有两种常用方法,分别为:除二取余法和递归法。通过对比和分析我们就会发现,除二取余法更为方便手动转换时使用,而递归法适合......
  • 基本知识笔记
    浮点数到定点数:【CO101】计算机组成原理笔记1——定点数转单精度浮点数(SEM)_定点转浮点原理-CSDN博客原码、补码、反码笔记:Verilog--有符号与无符号的加法和乘法运算_veriloga+b=c-CSDN博客是计算机中对数字的二进制表示方法。原码:将最高位作为符号位(0表示正,1表示负),其它......
  • 工程细节笔记
    SDRAM控制器读写非数据流的情况:在某些情况下最后剩下的那一段数据无法达到单次Brust长度,此时应该仲裁决定是否继续读写。这个问题在DDR3需要通过填0去解决,因为预读量远不是一个级别,填零以后通过截断获得有效数据是好的做法。//WR_req  always@(posedgeSys_clkornege......
  • 组合数学基础
    隔板法\(X_1+X_2+...+X_n=m,\quadX_i>=0\)\(求方程解的个数\)\(m个球插入n-1个板将m个球分成n份\)\(方程解的个数(^{n+m-1}_{m})\)如果要求每份球的个数都大于1该怎么做?\(X_1+X_2+...+X_n=m,\quadX_i>=1\)\(求方程解的个数\)\(令X^{'}=X_1-1,X^{'}>=0,\)\(X_1+X_2+......
  • 线段树二分——nc2.4多校_G.新春漫步
    目录问题概述思路分析参考代码做题反思问题概述原题参考G.新春漫步坐标轴上有n个点,初始时每个位置上都有一个坚固程度为a1的障碍物,接下来有m次操作1.将位置p上的障碍物的坚固程度减去x,若减去x后坚固程度小于等于0,则该障碍物消失2.询问一个人从p的位置向右走,最多能走到什么位......
  • 探索C语言的数据类型:解密编程世界的核心秘密
    ✨✨欢迎大家来到贝蒂大讲堂✨✨......
  • 《程序是怎样跑起来的》第三章观后感
    《程序是怎样跑起来的》这本书的第三章带领我深入到了程序的运行环境中,让我对计算机的内部运作有了更加细腻的认识。这一章着重于程序运行时的各种细节,包括操作系统的角色、内存管理、进程与线程的概念,以及输入输出系统的工作原理。首先,作者以简洁的语言解释了操作系统的核心职能......
  • 方法
    何为方法?System.out.println(),那么它是什么?Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合,我们设计方法的......