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上运行这段代码,得到的结果也会不同。
写这个的时候明显感到有的地方写的不妥,希望大家指出。
分享到:
相关推荐
本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口
本书第二版提供了对Thread和ThreadGroup类、Runnable接口和语言的同步操作符内容的全面讨论。它解释了如何在不同的平台上调度线程,如何开发CPUScheduler类来实现你自己的调度策略。其他扩展例子包括实现读/写锁、...
掌握创建线程的两种方式、同步代码块和同步方法的使用 了解线程的生命周期及其调度方式 熟悉线程安全问题 继承Thread类创建多线程 实现Runnable接口创建多线程
多线程线程概述线程的创建1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 使用线程池线程的调度线程的生命周期线程同步1. 方法一:同步代码块2. 方法二:同步方法3. 方法三:Lock(锁):4. 对比三种方法5....
线程调度是值按照特定的机制为多个线程分配CPU的使用权。 调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取...
通过实现 Runnable 接口来进行多线程编程。 采用扫描算法(SCAN 算法)来进行电梯调度。 某一层楼 20 层,有五部互联的电梯。基于线程思想,编写一个电梯调度程序。(可考虑:楼层和电梯数可设置)。 每个电梯里面...
线程的创建有继承Thread类和实现Runnable接口两种方式,通过Runnable方式可以更加容易实现多线程之间资源共享。 通过sleep可以使线程进入休眠状态,通过join方法可以让线程处于等待,其他线程执行完毕后继续执行。 ...
Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。...
建议使用实现接口的方式创建多线程 why? 因为实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务 1.继承Thread类:线程对象和线程任务耦合在一起。一旦创建Thread类的...
java并发编程实战pdf 线程与多线程 1.线程 在操作系统中,线程是比进程更小的能够独立运行的基本单位。同时,它也是 CPU 调度的基本单位。...Runnable 接口,实现 Callable 接口。简单的示例代码分别如下所示。
实现Runnable接口创建自线程 线程状态(创建、就绪、执行、阻塞、终止) 线程常用方法 inturrupt打断线程 join()线程并行执行变为串行 理解线程的概念 一个程序至少有一个进程,一个进程至少有一个线程; 线程是...
因为线程的调度具有不确定性,所以银行取钱问题、多个窗口售卖火车票问题都是反应多线程的优越性以及不确定性。当程序中有多个并发线程在进入一个代码块中并且修改其中参数时,就很有可能引发线程安全问题从而造成...
JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...
一,多线程概述。...Java语言的重要特征是在语言级支持多线程的程序设计。 二,多线程的生命周期。 三,创建线程的四种方式 1.继承Thread类。如下图所示。 2.实现Runnable接口。如下图所示。 3.使用Calla
ThreadImRunnable.java 继承Runnable接口实现多线程 mulThread.java 创建多个线程对象的类 demoJoin.java 演示使用join()以确保主线程最后结束 clicker.java 一个计数用的线程类 demoPri.java 调用上面这个类...
Java是为数不多的真正实现多线程并发编程的语言 说到线程程,我们就不由的得先说说进程,所谓是有爹再有儿。 什么是进程呢?进程是一个具有独立功能的程序,关于某个特定数据集合进行的一次运行活动。 进程...
Java多线程 [TOC] 线程状态 1.New:尚未启动的线程的线程状态 2.Runnable:可运行线程的线程状态,等待CPU调度 3.Blocked:线程阻塞等待监视器锁定的线程状态 4.Waiting:等待线程的线程状态(wait、join、park) 5....
60、java中有几种方法可以实现一...答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify 67、线程的基本概念、线程的基本状态以及状态之间的关系
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接口 ...