Thread类的其它方法和属性

简介: Thread类的其它方法和属性

接上篇文章

多线程能够提高任务完成的效率,

具体使用:

有两个整数变量,分别对着两个整数变量自增10亿次,分别使用一个线程和两个线程来观察时间的变化

package Thread;
import java.util.Scanner;
public class Demo7 {
    private static final long count = 10_0000_0000;
    public static void serial() {
        long beg = System.currentTimeMillis();
        long a = 0;
        long b = 0;
        for(int i = 0; i < count; i ++) {
            a ++;
        }
        for(int i = 0; i < count; i ++) {
            b ++;
        }
        long end = System.currentTimeMillis();
        System.out.println((end - beg) + "ms");
    }
    public static void concurrency() throws InterruptedException{
        long beg = System.currentTimeMillis();
        Thread thread1 = new Thread(() -> {
            long a = 0;
            for(int i = 0; i < count; i ++) {
                a ++;
            }
        });
        thread1.start();
        Thread thread2 = new Thread(() -> {
            long b = 0;
            for(int i = 0; i < count; i ++) {
                b ++;
            }
        });
        thread2.start();
        thread1.join();
        thread2.join();
        long end = System.currentTimeMillis();
        System.out.println((end - beg) + "ms");
    }
    public static void main(String[] args) throws InterruptedException {
        serial();
        concurrency();
    }
}

Thread类的其它属性和方法

Thread(String name),这个东西是给线程起名字,起一个什么样子的名字不影响线程本身的执行,仅仅影响到程序员的调试,可以借助一些工具可以看到每个线程的名字,很容易在调试的时候对线程做出区分,可以用jconsole来观察线程的名字

** 中断线程**

线程停下来的关键是让对应的run方法执行完(还有一个特殊的是main这个线程,对于main来说,得是main方法执行完,线程就完了)

  1. 可以手动的设置一个标志位(自己创建的变量,boolean),来控制线程是否要执行结束
    代码实现:
public class Main {
    private static boolean isQuit = false;
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
           while(! isQuit) {
               System.out.println("hello thread!");
               try {
                   Thread.sleep(1000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           }
        });
        thread.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isQuit = true;
    }
}

这种实现的方法并不严谨,假如有很多线程都要用这个标志位怎么办?

  1. 更好的方法是用一个Thread中内置的一个标志位来判定,可以通过两种方法来实现

Thread.interrupted(),这是一个静态的方法

Thread.currentThread().isInterrupt(),这是一个实例的方法,其中的currentThread就是获取当前线程的实例

使用样例:

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            while(! Thread.currentThread().isInterrupted()) {
                System.out.println("hello thread!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

这个代码绝大部分都是在休眠状态,此处的中断是希望立即产生效果的,如果线程已经是阻塞状态下,此时设置标志位就不能起到及时唤醒的效果

调佣t.interrupt(),这个方法可能产生两种情况

  1. 如果线程是出于就绪状态,就是设置线程的标志位为true
  2. 如果线程出于阻塞状态,就会触发一个异常,应该在异常的时候直接退出即可

线程等待

多个线程之间调度顺序是不确定的,线程之间的执行是按照调度器来来安排的,这个过程可视为是“无序,随机”,这样不太好,有些时候我们需要控制线程之间的顺序,线程等待就是一种控制线程执行顺序的手段,此处的线程等待,主要是控制线程结束的先后顺序

join,调佣join的时候,那个线程调用的join,那个线程就会阻塞等待,知道对应的线程执行完毕为止(对应的run方法执行完)

主要有:

1. 线程的创建

2. 线程的终结

3. 线程的等待

4. 线程获取引用

5. 线程的休眠


相关文章
|
24天前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
4月前
|
存储 Java 编译器
类、对象、方法
摘要: 本文介绍了面向对象编程的概念,以京东购买手机为例,展示了如何通过分类和参数选择商品,强调软件与现实生活的对应关系。柯南三步走揭示了京东如何通过搜索和筛选帮助用户找到所需商品,而这一切背后的编程思想即为面向对象编程。面向对象编程涉及抽象、自定义类型和实例化对象等步骤,其中自定义类型(如Java中的类)用于封装现实生活中的复杂数据。文章还讲解了如何定义类、实例化对象以及访问权限修饰符、构造方法、this关键字、方法的使用,强调了方法参数和返回值在不同数据类型上的处理差异。整个讨论旨在阐明Java中面向对象编程的基本原理和实践应用。
36 5
|
4月前
|
Java 程序员 调度
Thread类及常见方法
Thread类及常见方法
|
11月前
|
Java 程序员 调度
了解Thread类的其他一些方法及常见属性
了解Thread类的其他一些方法及常见属性
54 0
Thread 类的基本用法
比较推荐:使用 lambda 表达式创建线程的时候不用重写 run 方法。 不需要显式重写run方法的原因是因为线程的目标方法已经在Lambda表达式中定义了。Lambda表达式是一种用于创建匿名函数的语法糖,它可以将一个方法(或一段代码块)包装为一个函数对象。当您使用Lambda表达式创建线程时,Lambda表达式的内容会被视为线程执行的任务,这个任务会自动成为run方法的实现。
65 0
|
Java 调度
Thread类的方法
Thread类的方法
37 0
|
调度
Thread 类的基本方法
Thread 类的基本方法
76 0
|
Java
多线程的创建的方式一:继承于Thread类
多线程的创建的方式一:继承于Thread类
43 0
|
设计模式 算法 Java
Object 类详解--代码块--单例设计模式
Object 类详解--代码块--单例设计模式
50 0