`
womendu
  • 浏览: 1480839 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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上运行这段代码,得到的结果也会不同。

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

分享到:
评论

相关推荐

    Java多线程技术 线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    本书第二版提供了对Thread和ThreadGroup类、Runnable接口和语言的同步操作符内容的全面讨论。它解释了如何在不同的平台上调度线程,如何开发CPUScheduler类来实现你自己的调度策略。其他扩展例子包括实现读/写锁、...

    Java 多线程.pptx

    掌握创建线程的两种方式、同步代码块和同步方法的使用 了解线程的生命周期及其调度方式 熟悉线程安全问题 继承Thread类创建多线程 实现Runnable接口创建多线程

    讲给女朋友听的java多线程(2万字深入理解多线程,有实例代码辅助理解)

    多线程线程概述线程的创建1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 使用线程池线程的调度线程的生命周期线程同步1. 方法一:同步代码块2. 方法二:同步方法3. 方法三:Lock(锁):4. 对比三种方法5....

    深入研究java的几个类--Java多线程编程总结

    线程调度是值按照特定的机制为多个线程分配CPU的使用权。 调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取...

    基于Java实现(图形界面)多线程电梯调度【100010850】

    通过实现 Runnable 接口来进行多线程编程。 采用扫描算法(SCAN 算法)来进行电梯调度。 某一层楼 20 层,有五部互联的电梯。基于线程思想,编写一个电梯调度程序。(可考虑:楼层和电梯数可设置)。 每个电梯里面...

    Java高级程序设计-多线程(二).pptx

    线程的创建有继承Thread类和实现Runnable接口两种方式,通过Runnable方式可以更加容易实现多线程之间资源共享。 通过sleep可以使线程进入休眠状态,通过join方法可以让线程处于等待,其他线程执行完毕后继续执行。 ...

    Java基础[06-多线程].ppt

    Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。...

    进程和线程的常见面试问题

    建议使用实现接口的方式创建多线程 why? 因为实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务 1.继承Thread类:线程对象和线程任务耦合在一起。一旦创建Thread类的...

    深入理解高并发编程-Java线程池核心技术

    java并发编程实战pdf 线程与多线程 1.线程 在操作系统中,线程是比进程更小的能够独立运行的基本单位。同时,它也是 CPU 调度的基本单位。...Runnable 接口,实现 Callable 接口。简单的示例代码分别如下所示。

    Java线程

    实现Runnable接口创建自线程 线程状态(创建、就绪、执行、阻塞、终止) 线程常用方法 inturrupt打断线程 join()线程并行执行变为串行 理解线程的概念 一个程序至少有一个进程,一个进程至少有一个线程; 线程是...

    多线程两种方式和区别总结

    因为线程的调度具有不确定性,所以银行取钱问题、多个窗口售卖火车票问题都是反应多线程的优越性以及不确定性。当程序中有多个并发线程在进入一个代码块中并且修改其中参数时,就很有可能引发线程安全问题从而造成...

    第7章-JUC多线程v1.1.pdf

    JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...

    Java语言多线程

    一,多线程概述。...Java语言的重要特征是在语言级支持多线程的程序设计。 二,多线程的生命周期。 三,创建线程的四种方式 1.继承Thread类。如下图所示。 2.实现Runnable接口。如下图所示。   3.使用Calla

    Java开发技术大全(500个源代码).

    ThreadImRunnable.java 继承Runnable接口实现多线程 mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类...

    Java中的多线程编程

    Java是为数不多的真正实现多线程并发编程的语言   说到线程程,我们就不由的得先说说进程,所谓是有爹再有儿。   什么是进程呢?进程是一个具有独立功能的程序,关于某个特定数据集合进行的一次运行活动。   进程...

    java7源码-thread:多线程相关的学习

    Java多线程 [TOC] 线程状态 1.New:尚未启动的线程的线程状态 2.Runnable:可运行线程的线程状态,等待CPU调度 3.Blocked:线程阻塞等待监视器锁定的线程状态 4.Waiting:等待线程的线程状态(wait、join、park) 5....

    java笔试题大集合及答案(另附各大公司笔试题)

    60、java中有几种方法可以实现一...答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 67、线程的基本概念、线程的基本状态以及状态之间的关系

    JAVA语言程序设计【高清版】.pdf

    202 习题 203 第11章 线程 204 11.1 线程和多线程 204 11.1.1 线程的概念 204 11.1.2 线程的结构 205 11.2 线程的状态 205 11.3 创建线程 206 11.3.1 继承Thread类 206 11.3.2 实现Runnable接口 ...

Global site tag (gtag.js) - Google Analytics