iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java多线程Thread基础学习
  • 394
分享到

Java多线程Thread基础学习

Java多线程Java多线程Thread 2023-05-17 05:05:31 394人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 创建线程   1.1 通过构造函数:public Thread(Runnable target, String name){}  或:publ

1. 创建线程   

1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target){}

示例:

Thread thread1 = new Thread(new MyThread(), "mythread");
class MyThread extends Thread(){
        public void run(){
             System.out.println("My First Thread');
        }
}

1.2 直接实现Runnable接口:

示例:

Thread thread2 = new Thread(new Runnable{}{
         public void run(){
                  System.out.println("This is my thread.");
          }
});

2. 运行线程   

thead1.start()    

 3. sleep

try{
    #休眠1000ms
    Thread.sleep(1000);
}catch(InterruptedException e){
    e.printStackTrace();
}

4. getName() 获取线程名字, getId()获取线程id

System.out.println(Thread.currentThread().getName() + ":"+ Thread.currentThread().getId);

5. 停止线程,

千万不用stop(),stop会立即终止线程。

通过interrupt()中断线程,但是中断并没有停止线程,配合异常来实现:

public class Main {
   public static void main(String[] args) throws InterruptedException {
      try{
          Thread thread1=new Thread(new TheThread(),"thread1");
          thread1.start();
          Thread.sleep(2000);
          thread1.interrupt();
      }catch (InterruptedException e){
                  e.printStackTrace();
       }
   }
}
   class TheThread extends Thread{
     public void run() {
        super.run();
        for (int i = 0; i < 10; i++) {
           if(this.interrupted()){
              break;
        }
        System.out.println(Thread.currentThread().getName() + ":" + i);
     }
   }
}

注意,如果在TheThread类里加入catch InterruptException的话,可能会导致interrupt被捕获,而绕过if(this.interrupted())的判断而无法终止线程。

6. 等待和通知        

线程等待:当前线程就处于等待状态,直到其他线程调用了notify()方法,线程才会继续执行

public final void wait() throws InterruptedException

线程通知:

public final native void notify()

注意:在notify()方法后,当前线程不会马上释放该对象要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块中。

 package wait.notify;
 
 public class ThreadWaitNotifyTest {
     final static Object object=new Object();
     public static class T1 extends Thread{
         public void run(){
             System.out.println(System.currentTimeMillis()+": T1 start");
             synchronized (object){
                 try {
                     System.out.println(System.currentTimeMillis()+": T1 wait");
                     object.wait();
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
             System.out.println(System.currentTimeMillis()+": T1 end");
         }
     }
     public static class T2 extends Thread{
         public void run(){
             System.out.println(System.currentTimeMillis()+": T2 start");
             synchronized (object){
                 System.out.println("T2 synchonized code start.");
                 object.notify();
                 try {
                     Thread.sleep(2000);
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }finally{
                     System.out.println("T2 synchonized code end.");
                 }
 
             }
             try {
                 Thread.sleep(2000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
             System.out.println(System.currentTimeMillis()+": T2 end");
         }
     }
     public static void main(String[] args){
         Thread thread1=new T1();
         Thread thread2=new T2();
         thread1.start();
         thread2.start();
     }
 }

输出结果:

7. 线程优先级

高优先级的线程将会获得更多的CPU资源。一共分为10个优先级。

public final void setPriority(int newPriority)

源码分析

public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
            throw new IllegalArgumentException();
        }
        if((g = getThreadGroup()) != null) {
            if (newPriority > g.getMaxPriority()) {
                newPriority = g.getMaxPriority();
            }
            setPriority0(priority = newPriority);
        }
}
public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

可见线程最高优先级为10, 最低为1, 默认为5.

当设定的newPriority高于该线程组ThreadGroup的最高Priority时,只能分配该线程组的最高Priority

8. 守护线程

类似守护进程,Java存在两种线程:用户线程和守护线程。它是一种特殊线程,执行的是一种后台服务,当一个系统中不存在非守护线程的时候,守护线程会自己销毁。典型的守护线程:JVM的垃圾回收线程。

public final void setDaemon(boolean on)

示例:

public class Main {
    public static void main(String[] args) throws InterruptedException {
       TheThread theThread=new TheThread();
        theThread.setDaemon(true);//设置守护线程
        theThread.start();
        Thread.sleep(5000);
        System.out.println("全都退出啦");
    }
    public static class TheThread extends Thread{
        public void run(){
            int i = 0;
            while (true){
                i++;
                System.out.println(Thread.currentThread().getId()+":"+i);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

源码分析:

设置线程为用户线程(user thread)或守护线程(daemon thread),当剩余运行的线程均为守护线程时,JVM会退出。

 public final void setDaemon(boolean on) {
        checkAccess();
        if (isAlive()) {
            throw new IllegalThreadStateException();
        }
        daemon = on;
    }

其中checkAccesss()方法如下:

 public final void checkAccess() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkAccess(this);
        }
    }

该方法用于判断当前运行的线程是否有修改此线程的权限。

而public final native boolean isAlive();用于判断该线程是否处于alive状态,即该线程是否已经start,且没有die。

当isAlive的话就会抛出IllegalThreadStateException异常。

所以,设置守护线程的方法,逻辑就是先判断当前线程是否有修改的权限,再判断是否处于alive状态,如果不处于alive状态,则根据boolean变量on的值更改它的状态,即true:设为daemon线程,false:设为user线程。

到此这篇关于Java多线程基础学习的文章就介绍到这了,更多相关Java多线程基础内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java多线程Thread基础学习

本文链接: https://www.lsjlt.com/news/210664.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程Thread基础学习
    目录1. 创建线程   1.1 通过构造函数:public Thread(Runnable target, String name){}  或:publ...
    99+
    2023-05-17
    Java多线程 Java 多线程Thread
  • Java零基础学习多线程的示例
    这篇文章给大家分享的是有关Java零基础学习多线程的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。守护线程从线程分类上可以分为:用户线程(以上讲的都是用户线程),另一个是守护线程。守护线程是这样的,所有的用户...
    99+
    2023-06-06
  • C#多线程学习之基础入门
    目录同步方式异步多线程方式异步多线程优化异步回调异步信号量异步多线程返回值异步多线程返回值回调线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进...
    99+
    2024-04-02
  • python基础学习20----线程
    什么是线程   线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派...
    99+
    2023-01-30
    线程 基础 python
  • java——多线程基础
    目录多线程使用场景:线程和进程区别:创建线程的方式:Thread类的有关方法:线程的同步:模拟火车站售票程序线程的同步:synchronized1. 同步代码块:2. synchro...
    99+
    2024-04-02
  • Java多线程基础
    目录一、线程二、创建多线程的方式1、继承Thread类实现多线程2、实现Runnable接口方式实现多线程3、Callable接口创建线程三、线程的生命周期与状态四、线程的执行顺序1...
    99+
    2024-04-02
  • 学习java多线程
    目录介绍为什么需要多线程线程状态转换线程使用方式继承 Thread 类实现 Runnable 接口实现 Callable 接口同步代码---Runnable接口方式同步方法--Run...
    99+
    2024-04-02
  • 【Java】Java多线程编程基础
    文章目录 1. 进程与线程1.1 进程与线程的基本认识1.1.1 进程(Process)1.1.2 线程(Thread) 1.2 为什么会有线程1.2.1 以看视频为例 2. ...
    99+
    2023-10-03
    java python 开发语言
  • 转行Java能学会吗?零基础学习Java的学习路线
    Java的跨平台性、通用性、安全性、高效性决定了这门语言在未来10年都会是最热门的语言之一。Java技术的安全性和平台移植性足够让他应用到不同的领域,它的工作需求足够大,现实一点来说即使Java濒临out,在你精通Java的前提下,学习其他...
    99+
    2023-06-03
  • Python基础学习之认识线程
    目录一、什么是线程?二、再来解释线程的代码三、线程触发业务函数,线程调用业务函数四、多了一个线程是哪个?五、总结一、什么是线程? 我们知道工人都是同时在工厂工作,复制各自的工作的。他...
    99+
    2024-04-02
  • Java学习教程:Java基础——反射
    什么是反射?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。例如:我们在开发的过程当中,...
    99+
    2023-06-03
  • Java多线程——基础概念
    目录java多线程并发与并行:多线程使用场景:创建线程的方式:Thread类的有关方法:线程的同步:       ...
    99+
    2024-04-02
  • java多线程:基础详解
    目录Java内存模型主内存和工作内存的交互命令内存模型的原子性内存模型的可见性内存模型的有序性指令重排优化的底层原理valatile原理volatile与加锁的区别先行发生原则线程的...
    99+
    2024-04-02
  • JAVA多线程线程安全性基础
    目录线程安全性什么是线程安全的代码什么是线程安全性 总结线程安全性 一个对象是否需要是线程安全的,取决于它是否被多个线程访问,而不取决于对象要实现的功能 什么是线程安全的代码 核心:...
    99+
    2024-04-02
  • Java多线程学习笔记
    目录多任务、多线程程序、进程、线程学着看jdk文档线程的创建1.继承Thread类2.实现Runable接口理解并发的场景龟兔赛跑场景实现callable接口理解函数式接口理解线程的...
    99+
    2024-04-02
  • Java新手学习路线,0基础学习Java怎样效率更高?
    Java是老牌编程语言,拥有扎实的群众基础和广阔的市场应用,从业人员薪资也普遍较高。很多人想要加入到Java开发行列,不过0基础学习Java怎样效率更高?很多0基础学习Java的同学想知道怎样学习效率更高?小编以为,学习Java需要一个系统...
    99+
    2023-06-02
  • java语言基础学习
    个[@more@]string 类的主要方法public int length()public char charat(int index)public string tolowercase()public string toupperca...
    99+
    2023-06-03
  • c#基础学习之多态
    最近在看一本书《你必须知道的.Net》,书涵盖的内容比较多,对于c#,.Net平台以往所学的零散东西有了慢慢的总结和新的认识。把一些基础的东西记录于此。 先说说多态吧: 1.基类继承...
    99+
    2022-11-15
    c# 多态
  • C#多线程学习之Thread、ThreadPool、Task、Parallel四者区别
    目录ThreadThreadPoolTaskParallelTask专讲线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一...
    99+
    2024-04-02
  • Java 多线程学习总结3
    在上一篇中,我们当然希望a++,b++执行完之后,show方法再来show.我们需要的是“原子”动作,一次性地把a++,b++不间断地执行。在java中是利用“互斥”的方法,互斥谁呢?互斥的是相同对象的加锁代码。如果我们把第一篇的SomeB...
    99+
    2023-01-31
    多线程 Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作