多线程技术学习笔记


一、线程的创建

1.继承Thread类实现多线程

此方法缺点:
因为java不支持多继承,一但继承了Thread类就不能继承其他类

//继承Thread类实现多线程
public class TestThread extends Thread{
   
    //线程的线程体
    @Override
    public void run() {
   
        System.out.println(this.getName()+"线程开始");
        for (int i = 0;i<20;i++){
   
            System.out.println(this.getName()+" "+i);
        }
        System.out.println(this.getName()+"线程结束");
    }

    public static void main(String[] args) {
   
        System.out.println("主线程开始");
        TestThread t1 = new TestThread();
        //启动线程
        t1.start();
        TestThread t2 = new TestThread();
        t2.start();
        System.out.println("主线程结束");
    }
}

2.实现Runnable接口实现多线程

注意:

  1. 通过Thread类下的currentThread()方法返回当前线程对象然后再去获取当前线程的一些信息。例如通过Thread.currentThread().getName()获取线程名称
  2. 启动线程时要通过Thread包装使之成为真正的线程,再去调用start()方法启动。
    例如:Thread t2 = new Thread(new TestThread2()); t2.start();
//通过实现Runnable接口实现多线程
public class TestThread2 implements Runnable{
   
    //输出线程名称为:main原因:TestThread2没有被Thread所包装,所以不属于线程,只是一个普通的类,所以输出主线程名称
    public TestThread2() {
   
        System.out.println(Thread.currentThread().getName());
    }

    //当前线程的线程体方法
    @Override
    public void run() {
   
        //通过Thread类下的currentThread()方法返回当前线程对象然后再去获取当前线程的一些信息
        System.out.println(Thread.currentThread().getName()+"线程开始");
        for (int i=0;i<20;i++){
   
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
        System.out.println(Thread.currentThread().getName()+"线程结束");
    }

    public static void main(String[] args) {
   
        System.out.println("主线程开始");
        TestThread2 testThread2 = new TestThread2();
        Thread t1 = new Thread(testThread2);//该testThread2对象被Thread包装返回线程对象
        t1.start();

        Thread t2 = new Thread(new TestThread2());
        t2.start();
        System.out.println("主线程结束");
    }
}

二、线程的使用

1.终止线程

在这里插入图片描述

//终止线程
public class StopThread implements Runnable{
   
    private boolean flag = true;
    @Override
    public void run() {
   
        System.out.println(Thread.currentThread().getName()+" 线程开始");
        int i = 0;
        while (flag){
   
            System.out.println(Thread.currentThread().getName() +" "+i++);
            try {
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName()+" 线程结束");
    }

    public void stop(){
   
        this.flag = false;
    }

    public static void main(String[] args) throws Exception{
   
        System.out.println("主线程开始");
        StopThread st = new StopThread();
        Thread t1 = new Thread(st);
        t1.start();
        System.in.read();  //使主线程处于阻塞状态
        st.stop();
        System.out.println("主线程结束");
    }
}

2.线程暂停_sleep方法

在这里插入图片描述

//线程暂停_sleep方法
public class SleepThread implements Runnable{
   
    @Override
    public void run() {
   
        System.out.println(Thread.currentThread().getName()+" 线程开始");
        for (int i = 0;i<20;i++){
   
            System.out.println(Thread.currentThread().getName()+ " "+i);
            try {
   
                Thread.sleep(1000);   //由运行状态转为阻塞状态
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName()+" 线程结束");
    }

    public static void main(String[] args) {
   
        System.out.println("主线程开始");
        Thread t = new Thread(new SleepThread());
        t.start();
        System.out.println("主线程结束");
    }
}

3.线程暂停_yield方法

在这里插入图片描述

//线程暂停_yield方法
public class YieldThread implements Runnable{
   

    @Override
    public void run() {
   
        for (int i=0;i<30;i++){
   
            if ("Thread-0".equals(Thread.currentThread().getName())){
   
                if (i<=10){
   
                    Thread.yield();
                }
            }
            System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }

    public static void main(String[] args) {
   
        Thread t1 = new Thread(new YieldThread());
        Thread t2 = new Thread(new YieldThread());
        t1.start();
        t2.start();
    }
}

4.线程的联合

在这里插入图片描述

//通过join()方法实现线程的联合
class A implements Runnable{
   

    @Override
    public void run() {
   
        for (int i=0;i<10;i++){
   
            System.out.println(Thread.currentThread().getName()+" "+i);
            try {
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }
    }
}

class B implements Runnable{
   

    @Override
    public void run() {
   
        for (int i=0;i<20;i++){
   
            System.out.println(Thread.currentThread().getName()+" "+i);
            try {
   
                Thread.sleep(1000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
        }
    }
}
public class JoinThread {
   
    public static void main(String[] args) {
   
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值