Java多线程3—线程的调度和runnable接口优点

本文介绍了Java中线程调度的基本概念,包括抢占式调度模型和不同优先级线程的调度方式。通过示例程序展示了如何创建线程、设置优先级以及实现Runnable接口的优势。重点讨论了线程优先级的调整及其对程序执行顺序的影响。
摘要由CSDN通过智能技术生成

         Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行。在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优先级的线程变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得运行的机会。

Java线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换。Java运行时系统所在的操作系统(例如:Windows2000)支持时间片的轮换,则线程调度器就支持相同优先级线程的时间片轮换。下面我们写一个例子程序简单的介绍一下:

class MultiThread

{

   public static void main(String[] args)

   {

      MyThread mt=new MyThread();

      Threadt = newThread(mt);

t.start();

      while(true)

      {

         System.out.println("main:"+Thread.currentThread().getName());

      }

   }

}

 

class MyThreadimplementsRunnable//extends Thread

{

   public void run()

   {

      while(true)

      {

         System.out.println(Thread.currentThread().getName());

      }

   }

}

//Thread-0

Thread-0

Thread-0

Thread-0

main:main

main:main

main:main

main:main

        循环输出结果,这里两个线程交替执行,但是并不是由于java虚拟机使其切换的,是由于操做系统的时间片原则,使两个线程交替执行。如果我们希望改变线程的优先级,可以调用Thread类的setPriority()方法改变。这个方法需要一个参数,系统提供了几个常量MAX_PRIORITY、MIX_PRIORITY我们在使用这个方法的时候需要传递其中一个参数。我们修改一下上面的代码:

Thread t = new Thread(mt);

t.setPriority(MAX_PRIORITY);//加上这行代码

t.start();

         这样程序的执行结果就是一直执行Thread-0,在我们退出的时候才会执行main:main。多说一句,一般情况下我们不去修改线程的优先级,而且线程的优先级的改变不一定在start()方法前,在线程启动后,我们也可以根据需要改变线程的优先级。

       下面我们来说一下实现runnable接口的优势,第一个优势我上篇文章已经说了就不多说了,大家可以去http://blog.csdn.net/mengxiangyue/article/details/6865741看看。第二个优势就是,如果我们的多个线程需要同时访问相同的数据,如果我们继承Thread类的话,就需要这个类创建的线程间的数据进行通信,但是如果我们实现runnable接口的话,就不用那么做(这里有点不对,并不是所有的实现runnable接口都不用通信)。下面我们用一个程序说明一下:

class MultiThread

{

   public static void main(String[] args)

   {

      MyThread mt=new MyThread();

      new Thread(mt).start();

      new Thread(mt).start();

      new Thread(mt).start();

      new Thread(mt).start();

      for(int i = 0;i<100;i++)

      {

         System.out.println("main:"+Thread.currentThread().getName());

      }

   }

}

 

class MyThreadimplementsRunnable//extends Thread

{

   int index=0;

      public void run()

      {

         for(int i = 0;i<100;i++)

         {

            System.out.println(Thread.currentThread().getName()+":"+index++);

         }

      } 

}

//Thread-0:0

Thread-3:3

main:main

Thread-2:2

Thread-1:1

Thread-2:6

main:main

Thread-3:5

Thread-0:4

Thread-3:9

main:main……

       结果是这四个线程输出了从0到399,虽然顺序不是按照1、2、3……这样,但是也没有问题,这个原因是因为线程执行时候操做系统时间片调度原则产生的。如果你在你的PC上运行这段代码,得到的结果也会不同。

         写这个的时候明显感到有的地方写的不妥,希望大家指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值