Java多线程问题

本文介绍了一个线程的四种基本状态,并通过一个简单的多线程应用实例进行说明,该应用创建两个线程分别输出1到100之间的奇数和偶数。

一个线程可以有四种状态:
1、新(New):线程对象已经创建,但尚未启动,所以不可运行。

2、可运行(Runnable):意味着一旦时间分片机制有空闲的CPU周期提供给一个线程,那个线程便可立即开始运行。因此,线程可能在、也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行——它既没有“死”掉,也未被“堵塞”。

3、 死(Dead):从自己的run()方法中返回后,一个线程便已“死”掉。亦可调用stop()令其死掉,但会产生一个违例——属于Error的一个子类(也就是说,我们通常不捕获它)。记住一个违例的“掷”出应当是一个特殊事件,而不是正常程序运行的一部分。所以不建议你使用stop()(在Java 1.2则是坚决反对)。另外还有一个destroy()方法(它永远不会实现),应该尽可能地避免调用它,因为它非常武断,根本不会解除对象的锁定。

4、 堵塞(Blocked):线程可以运行,但有某种东西阻碍了它。若线程处于堵塞状态,调度机制可以简单地跳过它,不给它分配任何CPU时间。除非线程再次进入“可运行”状态,否则不会采取任何操作。


编写一个应用程序创建两个线程,一个线程打印输出1100之间所有的奇数,另外一个线程打印输出1100之间所有的偶数,要求两个线程随机休眠一段时间后继续打印输出下一个数。分别使用Runnable接口和Tread类编程实现。

package Multithreading;

public class Output {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		OddNumber oddnumber = new OddNumber();
		EvenNumber evennumber = new EvenNumber();
		oddnumber.start();
		evennumber.start();
		
	}
}




package Multithreading;

/**
 * 创建线程的方法--继承Thread
 * 打印输出1~100之间所有的奇数
 */
public class OddNumber extends Thread {
	int x;
	
	/* 重写run方法 */
	public void run() {
		for (x = 1; x <= 100; x++) 
		{
			if (x % 2 != 0) 
			{
				System.out.println("奇数是 " + x);
			}
			try {

				/* 线程睡眠,把控制权交出去 */
				sleep((int) (Math.random() * 100) + 100);

			} catch (InterruptedException e) {
				/* 线程执行结束 */
				System.out.println("DONE! " + getName());
			}
		}
	}
}





package Multithreading;

/**
 * 创建线程的方法--实现Runnalbe接口 
 * 打印输出1~100之间所有的偶数
 * 注意,因为实现的是接口,在调用方法时必须指明是当前的的线程,即加关键字Thread
 */
public class EvenNumber implements Runnable {
	int y;
	
	/* 重写run方法 */
	public void run() {
		for (y= 1; y <= 100; y++)
		{
			if (y % 2 == 0)
			{
				System.out.println("偶数是 " + y);
			}
			try {

				/* 线程睡眠,把控制权交出去 */
				Thread.sleep((int) (Math.random() * 200) + 200);

			} catch (InterruptedException e) {
				/* 线程执行结束 */
				System.out.println("DONE! " + Thread.currentThread().getName());
			}
		}
	}

	public void start() {
		run();
		
	}
}






package com.ljl.org.test4; /** *@DEMO:Interview *@Author:jilongliang *@Date:2013-4-17 * * 分别使用Runnable接口和Thread类编程实 编写应用程序创建两个线程一个线程打印输出11000之间所有的奇数(Odd Number) * 另外一个线程打印输出1-1000之间所有的偶数(Even Number)要求两个线程随机休眠 段时间后 继续打印输出一个数 * * 创建线程有两种方式: 1.实现Runnable接口 2.继承Thread类 * 实现方式和继承方式有啥区别? * 实现方式的好处:避免了单继承的局限性 在定义线程时. * 建议使用实现方式 * 区别: * 继承Thread:线程代码存放Thread子类run方法中 实现 * Runnable:线程代码存放接口的子类的run方法 * wait释放资源,释放锁 * sleep释放资源,不释放锁 */ @SuppressWarnings("all") public class Thread1 { public static void main(String[] args) { //方法 /* OddNumber js = new OddNumber(); js.start(); EvenNumber os = new EvenNumber(); os.start(); while (true) { if (js.i1 == 1000 || os.i2 == 1000) { System.exit(-1); } } */ //方法二 OddNum on=new OddNum(); EvenNum en=new EvenNum(); new Thread(on).start(); new Thread(en).start(); while (true) { if (on.i1 == 1000 || en.i2 == 1000) { System.exit(-1); } } } } /** * ============================继承Thread线程=============================== */ class EvenNumber extends Thread { int i2; @Override public void run() { for (i2 = 1; i2 <= 1000; i2++) { if (i2 % 2 == 0) { System.out.println("偶數" + i2); } try { sleep((int) (Math.random() * 500) + 500); } catch (Exception e) { } } } } class OddNumber extends Thread { int i1; @Override public void run() { for (i1 = 1; i1 <= 1000; i1++) { if (i1 % 2 != 0) { System.out.println("奇數" + i1); } try { sleep((int) (Math.random() * 500) + 500); } catch (Exception e) { } } } } /** * ============================实现Runnable的线程=============================== */ @SuppressWarnings("all") class OddNum implements Runnable { int i1; @Override public void run() { for (i1 = 1; i1 <= 1000; i1++) { if (i1 % 2 != 0) { System.out.println("奇數" + i1); } try { new Thread().sleep((int) (Math.random() * 500)+500); } catch (Exception e) { } } } } @SuppressWarnings("all") class EvenNum implements Runnable { int i2; @Override public void run() { for (i2 = 1; i2 <= 1000; i2++) { if (i2 % 2 == 0) { System.out.println("偶數" + i2); } try { /**在指定的毫秒数内让当前正在执行的线程休眠 * Math.random()一个小于1的随机数乘于500+500,随眠时间不会超过1000毫秒 */ //new Thread().sleep((int) (Math.random() * 500)+500); new Thread().sleep(1000);//也可以指定特定的参数毫秒 } catch (Exception e) { } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值