关于java:多线程-实现多线程

实现多线程

过程

正在运行的程序

  • 是零碎进行资源分配和调用的独立单位
  • 每一个过程都有它本人的内存空间和系统资源

线程

是过程中的单个顺序控制流,是一条执行门路

  • 单线程 一个过程如果只有一条执行门路,则称为单线程程序
  • 多线程 一个过程如果有多条执行门路,则称为多线程程序

多线程的实现形式

  • 形式1 继承Thread类

    1. 定义一个类MyThread继承Thread类
    2. 在MyThread类中重写run()办法
    3. 创立MyThread类的对象
    4. 启动线程
public class MyThread extends Thread{
   //重写run办法
   @Override
   public void run(){
      for(int i = 0;i<100;i++){
         System.out.ptintln(i);
      }
   }
}

//主程序
//创立MyThread对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//调用run办法并没有启动线程
my1.run();
my2.run();
//start导致此线程开始执行,java虚拟机调用此线程的run办法
my1.start();
my2.start();

设置和获取线程名称

  • 通过setname赋值,getname获取
  • 通过带参构造方法给线程设置名称
  • 通过动态的currentThread()办法获取以后正在执行线程对象,再用getname获取线程名称

public class MyThread extends Thread{
   //重写run办法
   @Override
   public void run(){
      for(int i = 0;i<100;i++){
         System.out.ptintln(getName()+":"+i);//因为是继承Thread类,所以能够间接调用Thread的getName()
      }
   }
}
//主程序
//创立MyThread对象
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
//将此此线程的名称更改为参数 name
//start导致此线程开始执行,java虚拟机调用此线程的run办法
my1.setName("高铁"); //给线程设置名称
my2.setName("飞机");

my1.start();
my2.start();


//下图是带参结构和无参结构
带参构造方法是thread类里的,所以要继承 用super拜访父类的带参结构
MyThread my1 = new MyThread(name:"高铁");
MyThread my2 = new MyThread(name:"飞机");



想要看main办法的线程名称,不能间接用getname办法,因为main办法没有继承Thread类

//currentThread() 返回对以后正在执行的线程对象的援用 是静态方法 
//所以想要返回main办法的线程名称
sout(Thread.currentThread().getName())//输入就是main  阐明main办法就在main这个线程里

线程调度

  • 分时调度模型:所有线程轮流应用CPU的使用权,平均分配每个线程占用CPU的工夫片
  • 抢占式调度模型:优先让优先级搞的线程应用CPU,如果优先级雷同,则随机抉择一个,优先级高的线程获取的CPU的工夫片绝对多一些

java应用的是抢占式调度模型

控制线程的优先级

public class MyThread extends Thread{
   //重写run办法
   @Override
   public void run(){
      for(int i = 0;i<100;i++){
         System.out.ptintln(getName()+":"+i);//因为是继承Thread类,所以能够间接调用Thread的getName()
      }
   }
}
//主程序
//创立MyThread对象
ThreadPriority tp1 = new ThreadPriority ();
ThreadPriority tp2 = new ThreadPriority ();
ThreadPriority tp3 = new ThreadPriority ();

tp1 .setName("高铁"); //给线程设置名称
tp2 .setName("飞机");
tp3 .setName("汽车");
//多线程程序执行随机性 

//getPriority()返回线程的优先级 全都输入5 这三个线程的优先级一样 所以在执行的时候随机抉择 
//返回5阐明零碎默认优先级是5
sout(tp1.getPriority());//5
sout(tp2.getPriority());//5
sout(tp3.getPriority());//5

//setPriority()更改线程的优先级
tp1.setPriority(1000);
//线程优先级更改为1000 会呈现非法参数异样 IllegalArguementException 
//阐明给的优先级不在范畴内 范畴是1-10 最高优先级是10 最低优先级是1
tp1.setPriority(5);
tp2.setPriority(10);
tp3.setPriority(1);
//线程优先级高,仅仅代表获取CPU的工夫片的几率高 而不是每次都跑在最后面

tp1.start();
tp2.start();
tp3.start();


线程管制


join那个必须是其余所有线程都得期待调用了join这个线程执行结束能力运行
setDaemon如果boolean值是true,就是将这个线程标为守护线程,如果主线程运行完,剩下都是守护线程,那么java虚拟机将会退出

public class ThreadSleep extends Thread{
   //重写run办法
   @Override
   public void run(){
      for(int i = 0;i<100;i++){
         System.out.ptintln(getName()+":"+i);//因为是继承Thread类,所以能够间接调用Thread的getName()
         Thread.sleep(millis:1000);//alt enter捕捉异样 
         //每输入一次就让这个线程休眠1000ms
      }
   }
}
//主程序
//创立MyThread对象
ThreadSleep ts1 = new ThreadSleep();
ThreadSleep ts2 = new ThreadSleep();
ThreadSleep ts3 = new ThreadSleep();

ts1 .setName("曹操"); //给线程设置名称
ts2 .setName("刘备");
ts3 .setName("孙权");

---------
//设置主线程为诸葛亮
Thread.currentThread().setName("诸葛亮");

//当主线程完结的时候,其余线程也不必活了
//就设置守护线程
ts1.setDaemon(true);
ts2.setDaemon(true);
ts3.setDaemon(true);
//设置下面三个为守护线程,主线程完结了,守护线程也完结 但并不会立刻完结 而是挣扎一下再完结了了 很快就执行结束 不是立刻隐没

----------
ts1.start();
ts1.join();//alt enter捕捉异样

//下面ts1调用了join办法,则只能ts1执行结束能力走上面的线程ts2 ts3
ts2.start();
ts3.start();

for(int i = 0;i<10,i++){
   sout(Thread.currentThread().setName("诸葛亮")+":"+i);//诸葛亮执行到9
}

sleep办法

join办法

后面的线程执行结束,能力执行前面的线程

线程生命周期

多线程的实现形式

  • 实现Runnable接口

    1. 当以一个类MyRunnable实现Runnable接口
    2. 在MyRunnable类中重写run()办法
    3. 创立MyRunnable类的对象
    4. 创立Thread类的对象,把MyRunnable对象作为构造方法的参数
    5. 启动线程
//自定义的MyRunnable类
public class MyRunnable implements Runnable{
   //重写run办法
   @Override
   public void run(){
      for(int i = 0;i<100;i++){
         System.out.ptintln(getName()+":"+i);//因为是用的Runnable接口,不是Thread类,所以不能间接调用Thread的getName()
         //下面的应该改为
         System.out.ptintln(Thread.currentThread().getName()+":"+i);//拿到以后执行的线程
      }
   }
}
//主程序
//创立MyRunnable对象
MyRunnable my = new MyRunnable();
//创立Thread类的对象,把MyRunnable对象作为构造方法的参数
//Thread(Runnable target) 默认参数名 无参结构
Thread t1 = new Thread(my);
Thread t2 = new Thread(my);

//有参结构 设置线程名称
Thread t1 = new Thread(my,name:"高铁");
Thread t2 = new Thread(my,name:"飞机");

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

接口不影响继承其余类,MyRunnable相当于一个资源,能够有多个线程调用

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

阿里云限时活动-1核2G-1M带宽-40-100G ,特惠价87.12元/年(原价1234.2元/年,可以直接买3年),速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据