首页 > 编程语言 >java 并发编程-基础篇

java 并发编程-基础篇

时间:2023-04-26 21:47:50浏览次数:47  
标签:run Thread start join 编程 并发 线程 打断 java

java 创建线程的三种方法

直接使用 Thread

// 创建线程对象
Thread t = new Thread() {
    public void run() {
        // 要执行的任务
    }
};
// 启动线程
t.start();

Runable 配合 Thread

把线程和任务分开。

Runnable runnable = new Runnable() {
    public void run(){
        // 要执行的任务
    }
};
// 创建线程对象
Thread t = new Thread( runnable );
// 启动线程
t.start();

java8 以后,可以使用 lambda 表达式简化代码。

// 创建任务对象
Runnable task2 = () -> log.debug("hello");
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

这里能够使用 lambda 的原因是:

对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个 lambda 表达式。这种接口称为函数式接口。

而 Runnable 就是一个函数式接口,其内部只有一个 run 方法。

FutureTask 配合 Thread

FutureTask 能够接收 Callable 类型的参数,用来处理有返回结果的情况。

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
    log.debug("hello");
    return 100;
});
// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);

需要注意的是,这里调用 task3.get() 获取返回值时,子线程执行完毕之前,主线程是阻塞的。(这里的作用类似于 join 方法)

常见方法

  • start():启动新线程。但 cup 的时间片不一定立刻分给它。
  • run():新线程启动后自己调用的方法。如果传递了 Runnable 对象,则会调用 Runnable 中的 run 方法。
  • join():等待线程运行结束。
  • join(long n):最多等待 n 毫秒。
  • getId:获取线程 id。
  • getName():获取线程名称。
  • setName():设置线程名称。
  • interrupt():打断线程。如果被打断线程正在 sleep、wait、join,则会抛出异常并清除打断标记(打断标记仍为 false),否则,设置打断标记(打断标记为 true)。
  • sleep(long n):静态方法,当前线程休眠 n 毫秒。此时 cpu 时间片让给其它线程。
  • yield():静态方法,让出 cpu 使用权。

start 与 run

调用 run 方法时,子线程内的操作仍在 主线程执行。

调用 start 方法时,子线程内的操作才是在其它线程执行。

sleep 与 yield

sleep 方法使线程从运行态进入阻塞态,且 sleep 结束后 cpu 不一定会立刻执行该线程。

yield 方法使线程从运行态进入就绪态,主动让出 cpu。

join 方法

主要用于线程同步。

一个线程里调用另一个线程的 join 方法,就会等待 另一个线程结束才会继续执行。

interrupt 方法

打断 sleep、yield、join 状态的线程时,被打断的线程会抛出异常,并且清除打断状态。即 interrupted 参数仍为 false。

但打断正常状态的线程时,interrupted 为 true(可以用于判断是否需要料理后事)。

守护线程

在所有非守护线程都结束时,守护线程无论是否执行完,都会结束。

通过 setDaemon(true) 来设置守护线程。

标签:run,Thread,start,join,编程,并发,线程,打断,java
From: https://www.cnblogs.com/huang-guosheng/p/17357438.html

相关文章

  • 实验3 控制语句与组合数据类型应用编程
    1。实验任务1task1.py1importrandom23print('用列表储存随机整数:')4lst=[random.randint(0,100)foriinrange(5)]5print(lst)67print('\n用集合储存随机整数:')8s1={random.randint(0,100)foriinrange(5)}9print(s1)1011print(&#......
  • 2023.4.26编程一小时打卡
    一、问题描述:有一元二次方程ax2+bx+c=0,其一般解为x1,2=(-b±b2-4ac)/2a,但若a=0或b2-4ac<0时,用此公式出错。编程序,从键盘输入a,b,c的值,求x1和x2。如果a=0或b2-4ac<0,输出出错信息。二、解题思路:首先,将定义a,b,c为浮点数,然后输入a,b,c,去判断二次项系数的大小是否符合,再去判断b*2......
  • Java Lambda Stream
    ::方法使用条件:lambada表达式的主体仅包含一个表达式,且lambada表达式只调用一个已经存在的方法;被引用的方法的参数列表与lambada表达式的输入输出一致以下是Java8中方法引用的一些语法:静态方法引用(staticmethod)语法:classname::methodname例如:Person::getAge对象的实例方......
  • java线程之Semaphore
    Semaphore是信号量,用于线程间同步。例子,公交车上大概有24个座位,但是车上总共有40个人,那么,只要有一个人下车,另一个人就能得到一个座位,假设到终点站之前,每个人都能坐下。代码如下:packagecom.concurrent;importjava.util.Random;importjava.util.concurrent.CountDownLatch;imp......
  • java线程之FutureTask
    FutureTask是线程的异步计算。如果有多个线程,每个线程都要花很多时间计算,而且所花时间不同,最后要统计,就要用到此类。此类有个done方法,等call完后,执行此方法。代码:packagecom.concurrent;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;importja......
  • java线程之wait、notifyAll
    wait、notifyAll是线程之间用来通信的,设计模式里的观察者模式。例子,上课前,同学在玩,一个同学观察老师是不是来了,如果来了,叫其他同学坐好。packagecom.concurrent;importjava.util.HashSet;importjava.util.Set;importjava.util.concurrent.CountDownLatch;importjava.util......
  • java之用volatile和不用volatile的区别
    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。 要解决这个问题,只需要像在本程序中的这样,把该变量......
  • java流程控制
    scanner创建一个新的扫描器对象,用于接受键盘数据Scannerscanner=newScanner(System.in);//使用next方式接收Stringsrt=scanner.next();//使用nextLine方式接收Stringsrt=scanner.nextLine();next():一定要读取到有效字符后才可以结束输入对输入有效字符之前......
  • 深入java虚拟机 - 垃圾收集 - 引用计数收集器
         引用计数是垃圾收集的早期策略。在这种方法中,堆中每一个对象都有一个引用计数。一个对象被创建了,并且指向该对象的引用被分配给一个变量,这个对象的引用计数被置为1。当任何其他变量被赋值为对这个对象的引用时,计数加1。当一个对象的引用超过了......
  • java 多线程 synchronized
    程序1:packagetestsynchronized;publicclassThread1implementsRunnable{ @Override publicvoidrun(){ synchronized(this){ for(inti=0;i<10;i++){ System.out.println(Thread.currentThread().getName() +"synchronizedloo......