Java的多线程

进程、线程、程序之间的区别:每个运行中的程序就是一个进程,当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程;当一个程序进入内存中运行,即变成了一个进程,进程是系统进行资源调度和分配的一个独立单位。

实现多线程主要有两种方式:1.实现Runnable接口,重写run函数;

2.继承Thread类(Thread类实现了Runnable接口),重写run函数。

一、通过实现Runn接口

Runnable接口非常简单,它只包含一个run方法,需要实现这个方法来高速系统线程将如何运行。

package test;

public class project1 {
	 
   public static void main(String []args) {

	     Runnable printA=new printChar('A',100);
	     Runnable printB=new printChar('B',100);
		 Runnable print100=new printNum(100);
		 
		 Thread thread1=new Thread(printA);
		 Thread thread2=new Thread(printB);
		 Thread thread3=new Thread(print100);
		 
		 thread1.start();
		 thread2.start();
		 thread3.start();
	}
}

 class printChar implements Runnable{
	private char charToPrint;
	private int time;
	public printChar(char charToPrint,int time) {
		this.charToPrint=charToPrint;
		this.time=time;
	}
	@Override
	public  void run() {
		for(int i=0;i<time;i++) {
			System.out.print(charToPrint);
		}
	}
}
 
 class printNum implements Runnable{
		
		private int lastNum;
		public printNum(int lastNum) {
			this.lastNum=lastNum;
		}
		@Override
		public void run() {
			for(int i=0;i<lastNum;i++)
				System.out.print(i+" ");
		}
	}

使用   Thread thread1=new Thread(printA);创建任务的进程  ,其中 printA为实例。

然后调用start()方法告诉Java虚拟机该线程准备运行   thread1.start();

还可以这样启动线程: 

 Runnable printA=new printChar('A',100);

new Thread(printA).start();

二、通过继承Thread类

Thread类的方法如下:

+Thread()  创建一个空的线程

+Thread(task:Runnable)   为指定任务创建一个线程

+start():void  开始一个线程导致JVM调用run方法

+isAlive():boolean  测试线程当前是否在运行

+setPriority(p:int):void为该线程指定优先级(1到10)

+join():void  等待该线程结束

+sleep(millis:long):void  让一个线程休眠指定时间,以毫秒为单位

+yield():void  引发一个线程暂停并允许其他线程执行

+interrupt():void中断该线程

	@Override
	public  void run() {
		for(int i=0;i<time;i++) {
			System.out.print(charToPrint);
			Thread.yield();
		}
	}

每打印一个字母后,printA/printB线程就会让出时间给其他线程。

@Override
		public void run() {
			try {
			for(int i=0;i<lastNum;i++)
				System.out.print(i+" ");
			    Thread.sleep(1);

		}catch(Exception e) {
			e.printStackTrace();
	 }
	}

每打印一个数字之和,print100线程就会休眠1毫秒。sleep方法可能抛出一个InterruptedException,这是一个必检异常,当interrupt()方法被调用时,就会抛出这样一个异常。

@Override
		public void run() {
			Thread thread4=new Thread(new printChar('C',140));
			thread4.start();
			try {
			for(int i=0;i<lastNum;i++) {			
				thread4.join();
				System.out.print(i+" ");
			}
		}catch(Exception e) {
			e.printStackTrace();
	 }
	}

join()方法使得,thread4线程结束后,run()方法继续打印数字。

Java给每个线程指定一个优先级。默认情况下,线程继承生成它们的线程的优先级。可以用setPriority改变线程的优先级。还可以用getPriority方法获取线程的优先级。优先级从1到10.Thread类的int类型常量MIN-PRIORITY、NORM-PRIORITY 、MAX-PRIORITY,分别代表1,5,10.主线程的优先级是Thread.NORM-PRIORITY。

Java虚拟机总是选择优先级最高的可运行线程来运行。如果所有可运行线程具有相同的优先级,那将会用循环队列给它们分配相同的CPU份额,这称为循环调度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值