首页 > 编程语言 >多线程——Robyn编程学习(Java)

多线程——Robyn编程学习(Java)

时间:2022-09-26 12:33:33浏览次数:54  
标签:Runnable Java Thread Robyn start 线程 多线程 方法

多线程的作用

能够创建多个线程,此外线程可以体现程序的动态性,提高效率,在抢票以及各种游戏之中具有非常重要的作用。(线程的魅力在坦克大战中体现的淋漓尽致)

多线程的知识体系

多线程的基本使用

创建线程对象

public class T1 implements Runnable {//实现Runnable接口
    int count = 0;
    @Override
    public void run() {
        while(true){
            System.out.println("hello!"+(++count));
            try{
                Thread.sleep(1000);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            if(count == 60){
                break;
            }
        }
    }
}

启动线程对象

T1 t1 = new T1();
//t1.run();//我为什么不直接run就好了,并没有真正地开线程
//正确的创建方式,创建一个thread对象,然后来启动进程
Thread thread1 = new Thread(t1);
thread1.start();

这里就会产生一个疑问,我为什么不直接用t1.run方法,反而要创建一个线程对象,然后再用start方法运行呢?
run方法就是一个普通方法,不会启动线程,真正实现start方法的是里面的start0的本地方法,该使用多线程的机制来调用run方法,这也是为什么得创建一个thread对象,因为为了启动start方法


Q:那么继承Thread方法和实现Runnable方法有何区别呢?

A:从本质上来看,两者没有区别,其实Thread也是实现了Runnable接口,但是实现Runnable方法避免了单继承的限制,因此建议使用。

线程常用方法

线程的礼让和插队方法

for(int i = 1; i <= 10;i++){
System.out.println("hi" + i)
if(i == 5){
    t3.start();//启动主线程
    t3.join();//插入到main线程中,让t3先执行
}
	Thread.sleep(1000);
}

线程的同步机制

可以在需要控制同步的方法上加synchronized锁,保证同一时段只有一个程序运行,这个可以在售票机制方法中体现。

public class SellTicket implements Runnable {//我把这个叫做售票进程
    private int tickNum = 100;
    private Boolean loop = true;
    //重新定义售票方法(我这里是在方法中实现的同步)
    public synchronized void sell(){
        if(tickNum <= 0){
            System.out.println("售票结束!");
            loop = false;//控制进程的运行
            return;
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口"+Thread.currentThread().getName()+"售出一张票,剩余票数 "+(--tickNum));
    }

    @Override
    public void run() {

        while (loop) {
            sell();
        }
    }
}

 SellTicket sellTicket1 = new SellTicket();
        System.out.println("开始卖票");
        new Thread(sellTicket1).start();//就是同一个对象开3个线程?同一个卖票对象开3个线程?-这就是多线程的意义
        new Thread(sellTicket1).start();
        new Thread(sellTicket1).start();

标签:Runnable,Java,Thread,Robyn,start,线程,多线程,方法
From: https://www.cnblogs.com/robyn2022/p/16730479.html

相关文章

  • JAVA 反射与模块化
    JAVA反射与模块化类加载类的初始化步骤假如类还未被加载和连接,则程序现在加载并连接该类假如该类的直接父类还未被初始化,则先初始化其直接父类假如类中有初始化语......
  • 【记录】学习 阿里巴巴Java开发手册 (持续更新)
    前言在这里记录一下自己学习编码的规范和规约的过程,希望可以纠正自己的不良习惯,让编码更加规范和合理,具有更加好的可读性。阿里巴巴Java开发手册v1.3.0分为六个部分。针......
  • 【code基础】java 空数组
    解题时,如果不满足返回空数组,可以使用newint[0]返回@TestpublicvoidintTest(){int[]ints=newint[0];//指定元素个数为0,表示空数组int[]ints1=newint[......
  • 多线程批量删除后再查询所遇到的坑
    问题:以前对于多线程异步执行没有细想,认为已经采用的countdownlatch,保证了任务全部执行完毕。实际上,并不是我认为的那样。首先,一个方法是多线程异步批量删除数据,另一个方......
  • java中overload与override的区别
    1、综述重写(Override)也称覆盖,它是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现。override从字面就可以知道,它是覆盖了一个方法并......
  • JavaScript 数组常用方法大全
    Array对象所有方法concat()方法合并多个数组,返回一个新数组join() 方法将数组合并为字符串,用指定的字符分割pop()方法删除成员(从后) 并返回该被删......
  • Mybatis的mapper与Java实体类的关系
    Mybatis当中有一个重要概念:ORM(ObjectRelationMapping),对象关系映射。也就Java实体类的属于与关系型数据库column的对应关系。我们在mybatis的mapper.xml当中用#{}来......
  • Mybatis的SqlSession把Java Map作为参数
    Mybatis的以下方法,可以有一个参数,也可以有两个参数。如果有两个参数,则第一个参数为SQL语句;第二个参数是Object。sqlSession.insert("insertCar",carMap);以上的"inser......
  • 秀真的学习日记:学Java的第一天
    秀真的学习日记:学Java的第一天快捷键ctrl+A=全选ctrl+X=剪切ctrl+C=复制ctrl+Z=撤销ctrl+V=粘贴ctrl+S=......
  • 计算机毕设选题推荐 springboot+vue二手车交易平台 ssm+vue二手车拍卖系统 二手车商城
    ......