线程(基础和线程控制)

一、线程基础

1.1进程和线程的区别?

  1. 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
  2. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,而线程是共享进程中的数据、地址空间
  3. 线程之间的通信更方便,同一进程下线程共享全局变量、静态变量等数据,而进程之间通信需要以通信的方式(IPC)进行
  4. 多进程程序更加健壮,多线程程序只要有一个线程死掉,整个进程也会死掉,而一个进程死掉并不会对另一个进程造成影响,因为进程有自己的独立空间
  5. 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

1.2协程的相关概念?

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。从技术的角度来说,“协程就是你可以暂停执行的函数”。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

二、线程控制

2.1线程的创建

2.1.1显示集成Thread,重写run来指定线程执行代码

public class MyThread extends Thread {
    @Override
    public void run() {
        for(int i=0; i<100; i++) {
            System.out.println(i);
        }
    }
}
public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread my1 = new MyThread();
        MyThread my2 = new MyThread();
        //void start() 导致此线程开始执行; Java虚拟机调用此线程的run方法
        my1.start();
        my2.start();
    }
}

2.1.2匿名内部类集成Thread,重写run来指定线程执行代码

// 构造方法的参数是给线程指定名字,推荐
Thread t1 = new Thread("t1") {
    @Override
    // run 方法内实现了要执行的任务
    public void run() {
        System.out.println("hello");
    }
};
t1.start();

2.1.3显示实现Runnable接口,重写run方法

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for(int i=0; i<100; i++) {
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
}
public class MyRunnableDemo {
    public static void main(String[] args) {
        //创建MyRunnable类的对象
        MyRunnable my = new MyRunnable();

        //创建Thread类的对象,把MyRunnable对象作为构造方法的参数
        Thread t1 = new Thread(my,"坦克");
        Thread t2 = new Thread(my,"飞机");

        //启动线程
        t1.start();
        t2.start();
    }
}

2.1.4匿名内部类实现Runable接口,重写run方法

// 创建任务对象
Runnable task2 = new Runnable() {
    @Override
    public void run() {
        System.out.println("hello");
    }
};
// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();

2.1.5通过lambda表达式来描述线程执行代码

// 创建任务对象
Runnable task2 = () ->  System.out.println("hello");

// 参数1 是任务对象; 参数2 是线程名字,推荐
Thread t2 = new Thread(task2, "t2");
t2.start();
  • Thread的run和start之间的区别?
    1.run:这是一个普通方法的调用没有创建新的线程. 输出语句实在原线程中执行的
    2.start:这是要创建一个新的线程,由新的线程来执行输出

2.2线程相关方法介绍

在这里插入图片描述

2.3线程等待

  • join : 线程A调用了线程B的join方法,此时A就阻塞,一致阻塞到B这个线程执行结束
  • 存在的意义就是为了控制线程之间结束的先后顺序.

2.4线程休眠

  • sleep: 线程A调用了sleep,A就阻塞了,阻塞到sleep时间到
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值