首页 > 其他分享 >1.多线程(实现方式,常用方法,生命周期)

1.多线程(实现方式,常用方法,生命周期)

时间:2023-09-24 16:00:13浏览次数:48  
标签:常用 生命周期 Thread void 线程 static 多线程 public

多线程(实现方式,常用方法,生命周期)

概述:

  1. 可以让程序同时做多件事情;
  2. 可以提高效率;
  3. 只要你想让多个事情同时运行就需要用到多线程;
    • 如: 软件中的耗时操作、所有的聊天软件、所有的服务器‘

并发和并行:

  1. 并发:在同一时刻,有多个指令在单个CPU上交替执行;
  2. 并行:在同一时刻,有多个指令在多个CPU上同时执行;

多线程的实现方式:

继承Thread类的方式进行实现:
  • 此子类应继承Thread类并重写run方法。 然后可以分配和启动子类的实例;
  • 然后再创建该对象,调用start方法,则可以启动这个线程,会自动调用run方法;
package com.caihongjia.a0threadcase1;

public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.setName("线程一");
        t2.setName("线程二");

        t1.start();
        t2.start();
    }
}
package com.caihongjia.a0threadcase1;

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "666");
        }
    }
}
实现Runnable接口的方式进行实现:
  • 此子类应继承Runnable类并重写run方法;
  • 创建一个实例,然后在创建Thread时作为参数传递,调用start方法,则可以启动这个线程;
package com.caihongjia.a0threadcase2;

public class ThreadDemo {
    public static void main(String[] args) {
        //创建MyRun的对象
        //表示多线程要执行的任务
        MyRun mr = new MyRun();

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

        //给线程设置名字
        t1.setName("线程1");
        t2.setName("线程2");

        //开启线程
        t1.start();
        t2.start();
    }
}
package com.caihongjia.a0threadcase2;

public class MyRun implements Runnable{
    @Override
    public void run() {
        //书写线程要执行的代码
        for (int i = 0; i < 100; i++) {
            //获取到当前线程的对象
            Thread t = Thread.currentThread();
            System.out.println(t.getName() + "666");
        }
    }
}
利用Callable接口和Future接口方式实现:
  • 特点:可以获得到多线程运行的结果;
  • 创建一个类MyCallable实现Callable接口;
  • 重写call(是有返回值的,表示多线程运行的结果);
  • 创建MyCallable的对象(表示多线程要执行的任务);
  • 创建FutureTask的对象(作用管理多线程运行的结果);
  • 创建Thread类的对象,并启动(表示线程);
package com.caihongjia.a0threadcase3;

import com.caihongjia.a0threadcase2.MyRun;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class ThreadDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        //创建MyCallable的对象(表示多线程要执行的任务);
        MyCallable mc = new MyCallable();

        //创建FutureTask的对象(作用管理多线程运行的结果);
        FutureTask<Integer> ft = new FutureTask<>(mc);

        //创建Thread类的对象,并启动(表示线程);
        Thread t = new Thread(ft);
        t.start();

        //获取多线程运行的结果
        Integer i = ft.get();
        System.out.println(i);


    }
}
package com.caihongjia.a0threadcase3;

import java.util.concurrent.Callable;

public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}

方式对比:

常见的成员方法:

String getName()							返回此线程的名称
void setName(String name)					设置线程的名字(构造方法也可以设置名字)
static Thread currentThread()				获取当前线程的对象
static void sleep(long time)				让线程休眠指定的时间,单位为毫秒
setPriority(int newPriority)				设置线程的优先级
final int getPriority()						获取线程的优先级
final void setDaemon(boolean on)			设置为守护线程
public static void yield()					出让线程/礼让线程
public static void join()					插入线程/插队线程
细节:
String getName()							返回此线程的名称
void setName(String name)					设置线程的名字(构造方法也可以设置名字)
细节:
	1.如果我们没有给线程设置名字,线程也是有默认的名字的
		格式:Thread-X(x序号,从0开始的)
	2.如果我们要给线程设置名字,可以用setName方法进行设置,也可以构造方法设置
	
static Thread currentThread()				获取当前线程的对象
细节:
	当JVM虚拟机启动之后,会自动的启动多条线程
	其中有一条线程就叫做main线程
	他的作用就是去调用main方法,并执行里面的代码
	在以前,我们写的所有的代码,其实都是运行在main线程当中
	
static void sleep(long time)				让线程休眠指定的时间,单位为毫秒
细节:
	1.那条线程执行到这个方法,那么那条线程就会在这里停留对应的时间
	2.方法的参数: 就表示睡眠的时间,单位毫秒
	3.当时间到了之后,线程会自动的醒来,继续执行下面的其他代码
	
setPriority(int newPriority)				设置线程的优先级
final int getPriority()						获取线程的优先级
细节:
	默认优先级为5; 最大优先级为10; 最小优先级为1;
	
final void setDaemon(boolean on)			设置为守护线程
细节:
	当其他的非守护线程执行完毕之后,守护线程会陆续结束;

线程的生命周期:

标签:常用,生命周期,Thread,void,线程,static,多线程,public
From: https://www.cnblogs.com/chj020415/p/17726093.html

相关文章

  • VsCode常用快捷键记录
    取消撤销Win:ctrl+yMac:shift+command+z全局搜索Win:shift+ctrl+fMac:shift+command+f向上/向下复制当前行Win:shift+alt+up/downMac:shift+option+up/down代码格式化Win:shift+alt+fMac:shift+option+f列选择(垂直选中)快捷......
  • Java语言中几个常用的包
    第一个包:java.lang包。该包提供了Java语言进行程序设计的基础类,它是默认导入的包。该包里面的Runnable接口和Object、Math、String、StringBuffer、System、Thread以及Throwable类需要重点掌握,因为它们应用很广。第二个包:java.util包。该包提供了包含集合框架、遗留的集合类、......
  • Curl 常用参数
    (1)-X为请求方法,如curl-XPUT即接口为PUT方法,curl-XPOST即为POST方法,curl-XGET为GET方法,如不带-X直接请求,则默认为GET请求,比如核心运管登录的接口测试使用口令curl-XGEThttp://10.19.185.216:17150/asab-web/visual/getAllCameracurl-XPOSThttp://10.19.185.216:1715......
  • Linux上最常用的SSH图形界面工具,你知道吗?
    作者:JackWallen译者:LCTTXingyu.Wang|2019-02-2113:57了解一下这三个用于Linux上的SSH图形界面工具。在你兼任Linux管理员的职业生涯中,你会使用SecureShell(SSH)远程联接到Linux服务器或桌面。可能你当初在个别情况下,会同时SSH联接到多个Linux服务器。实际上,SSH可能是Linux工具箱......
  • 日常学习中常用的网站
    以下皆为个人学习中了解到的较为好用的一些网站噢1.设计网站:http://hao.shejidaren.com2.计算机相关网站:对于我的经历来说,官方提供的文档和一些教学视频搭配起来学的是比较快的。当然,最重要的就是多敲代码。-菜鸟教学:https://www.runoob.com/-W3school:https://www.w3s......
  • socket的常用方法
    上一篇文章中简单介绍了socket,文章最后贴了一个小小的demo,从函数调用流程来看,其实就能明白socket使用的一个逻辑。那么这篇文章,就深入研究一下,每一个步骤里的每一个参数都是什么意思?回顾demo代码段:socket_demo.c#include<stdio.h>#include<string.h>#include<stdlib.h>#in......
  • KGC常用评价指标
    KGC评价指标1.MRMR的全称是MeanRanking,具体的计算方法如下:其中,S是三元组集合,|S|是三元组个数,rank_i是指第i个三元组的链接预测排名。该指标越小越好。2.MRRMRR的全称是MeanReciprocalRanking,其中Reciprocal是指“倒数的”的意思。具体的计算方法如下:其中,S是三元组集......
  • java---常用类
    12.1时间类型(重点)Date类来自于java.util包中,用于显示当前的系统时间。1.语法:importjava.util.Date;Date对象名=newDate();创建了一个当前系统时间对象,如果要获具体的年,月,日,时,分秒的时候工具提示中划删除线的方法代表是过时的方法,过时的方法不建议使用,非要使用也没问题。@Dep......
  • 印象笔记常用快捷键组合
    []1.Ctrl+Alt+N:切换到印象笔记并跳转至一条新笔记[]2.Win+PrintScreen:开启捕捉屏幕[]3.Esc:取消屏幕捕获[]4.Win+A:剪辑选区[]5.Win+Shift+F:在印象笔记中查找(开始一个新的印象笔记搜索)[]6.Ctrl+Alt+V:将剪贴板内容粘贴到印象笔记作为一条新笔记[]7.F9:开始与印象笔记网页版同步......
  • Elasticsearch 常用指令
    Elasticsearch常用指令查询所有节点$curl'http://127.0.0.1:9200/_cat/nodes'192.168.31.127496102.162.112.03dilmrt*node-1查询集群状态$curl-k'http://127.0.0.1:9200/_cluster/health?pretty'{"cluster_name":"docker-clus......