首页 > 其他分享 >多线程

多线程

时间:2022-10-11 22:55:20浏览次数:47  
标签:Thread void Cat class 线程 多线程 public

创建线程

  • 继承Thread类创建线程
public class Thread01 {
    public static void main(String[] args) {
        //创建Cat对象,可以当做线程使用
        Cat cat = new Cat();
        //启动线程
        cat.start();
    }
}
//当一个类继承了Thread类,改类就可以做线程使用
class Cat extends Thread{
    @Override
    public void run() {
        System.out.println("喵喵喵");
    }
}
  • 实现Runable接口
public class Thread02 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        //将实现Runnable接口的类放入Thread(使用了代理模式)
        Thread t = new Thread(cat);
        t.start();
    }
}

//实现Runnable接口
class Cat implements Runnable{
    public void run() {
        System.out.println("喵喵喵");
    }
}
  • 多线程卖票实例
public class SellTicket{
    public static void main(String[] args) {
        //创建三个线程
        SellTicket01 thread01 = new SellTicket01();
        SellTicket01 thread02 = new SellTicket01();
        SellTicket01 thread03 = new SellTicket01();

        //启动三个线程
        thread01.start();
        thread02.start();
        thread03.start();
    }
}

class SellTicket01 extends  Thread{
    //票数
    private static int ticketNum = 100;

    @Override
    public void run() {
        while (true){
            if (ticketNum <= 0){
                System.out.println("售票结束");
                break;
            }

            //休眠50ms
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("窗口 "+Thread.currentThread().getName()+" 售出一张票,剩余票数 "+ (--ticketNum));
        }
    }
}
  • 存在问题,票数超卖问题(未加锁)

通知线程退出

public class Thread03 {
    public static void main(String[] args) throws Exception {
        Cat cat = new Cat();
        cat.start();
        Thread.sleep(1000);
        //通知线程,通过设置Cat对象flog通知线程停止
        cat.setFlog(false);
    }
}

class Cat extends Thread{
    
    private boolean flog = true;
    
    public void setFlog(boolean flog) {
        this.flog=flog;
    }
    @Override
    public void run() {
        while (flog){
            System.out.println("喵喵喵");
        }
    }
}

线程插队

  • yield:线程的让步。让出cpu,让其他线程执行,但礼让的时间不确定,所以也不一定让步成功
  • join:线程的插队。插队的线程一旦插队成功,则肯定先执行完插入的线程所有任务

  • 案例
    • 主线程创建一个子线程,每隔1s输入hello,输出10次,主线程每个1s输出hi,输出10次
    • 两个线程同时进行,当主线程输出5次后,就让子线程运行完毕,主线程再继续
public class Thread04 {
    public static void main(String[] args) throws Exception {
        //子线程打印10次hello
        T t = new T();
        t.start();

        //主线程打印10次hi
        for (int i =0;i<=10;i++){
            Thread.sleep(1000);
            System.out.println("hi " + i);

            //当打印了5次时让子线程运行完毕,主线程再继续(子线程t插队)
            if (i == 5){
                t.join();
            }
        }
    }
}

class T extends Thread{
    @Override
    public void run() {
        for (int i=1;i<=10;i++){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("hello " + i);
        }
    }
}

线程的声明周期

标签:Thread,void,Cat,class,线程,多线程,public
From: https://www.cnblogs.com/blackyoumo/p/16782636.html

相关文章

  • 26、JAVA进阶——多线程
    ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。......
  • 程序、进程、线程、多线程是什么,为什么要用多线程?Java基础复习--数组数据结构分析 ins
    大家可分享关于Java微服务相关知识,包括但不限于Java微服务开发经验、架构组成、技术交流、中间件等内容,我们鼓励springcloud架构为基础发散出击,从而达到技术积累的目的,快来......
  • 多线程 - (五)Executor框架
    Executor框架详解Executor框架应用使用Executor框架解决仓库配货时的并发问题基本思路:因为仓库出库单出库配货时,存在资源共享问题(商品共享),所以多线程并发配货时存在同步问题......
  • 多线程学习笔记(Java深度调试日常学习更新)
    1、单CPU时多线程不带来性能上的提升(有可能在线程切换时导致性能下降)因为多线程中,当一个线程被阻塞时,另一个线程可以继续利用CPU,这样的场景可以充分及时利用CPU2、锁的本......
  • gdb调试多进程和多线程命令
    1.默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:pare......
  • Java 多线程(五)线程状态
    一,线程五大状态:详细说明:   二,线程方法:   1.停止线程*不推荐使用JDK提供的stop(),destroy()方法【已废弃】*推荐线程自己停下来*建议使用一个标志位进......
  • Java 多线程知识的简单总结
    Java提供了多线程编程的内置支持,让我们可以轻松开发多线程应用。Java中我们最为熟悉的线程就是main线程——主线程。一个进程可以并发多个线程,每条线程并行执行不同的任......
  • C++多线程同步技巧(二) ---事件
    简介Windows在线程控制方面提供了多种信号处理机制,其中一种便是使用CreateEvent()函数创建事件,然后使用信号控制线程运行。其中将事件变为有信号可使用SetEvent()函数,将......
  • Java 多线程(四)Lambda表达式
    Lamda表达式λ希腊字母表中排序第十一位的字母,英语名为Lambda避免匿名内部类定义过的多其实质属于函数式编程的概念理解函数式接口是学习Java8Lambda表达式的关键所......
  • 【博学谷学习记录】超强总结,用心分享 。多线程相关点知识学习。
    一、实现多线程1.1了解多线程多线程是指从软件或硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提......