现在的位置: 首页 > 综合 > 正文

Java多线程机制–Java中的线程

2019年06月03日 ⁄ 综合 ⁄ 共 2133字 ⁄ 字号 评论关闭

Java多线程机制--Java中的线程

一、首先理解程序、进程与线程的关系(略,需个人思考理解)。

其中每个进程都有一段专用的内存区域,但是线程之间可以共享相同的内存单元,利用这些共享单元实现数据交换,实时通信和必要的同步操作。

二、线程的状态和生命周期

1、新建

Thread类或者其子类被声明时,已经分配相应的内存空间和资源。但JVMjava虚拟机)尚未将CPU的使用权分给它。

2、运行

线程通过调用start()方法,通知JVM此线程进入等待使用CPU的队列中。

JVMCPU使用权切换给这个线程时,就会运行类内的run()方法。因此当通过Thread子类创建的线程时,必须重写子类的run()方法。Run()方法规定了该线程的具体使命。

注意:在线程没有结束run方法时,不要调用start()方法,否则会出现IllegalArgumenException

3、中断

四种原因:

  • JVM调动。
  • 调用sleep()方法。
  • 调用wait()方法,一直等待知道其他线程调用notifi()方法通知它苏醒。
  • 进入阻塞阶段。

4、死亡

正常死亡即运行完run方法。

非正常死亡即线程被强行终止。

总之,死亡即释放分配给线程对象的内存。

 

示例代码:

SpeakHello.java

package com.java.study.until;

public class SpeakHello extends Thread {

	public void run() {
		for (int i = 0; i < 15; i++) {
			System.out.println("Hello" + i + "");
		}
	}
}

SpeakNihao.java

 

package com.java.study.until;

public class SpeakNihao extends Thread {

	public void run() {
		for (int i = 0; i < 15; i++) {
			System.out.println("你好" + i + "");
		}
	}

}

ThreadTest01.java

package com.java.study;

import com.java.study.until.SpeakHello;
import com.java.study.until.SpeakNihao;

public class ThreadTest01 {
	public static void main(String[] args) {
		SpeakHello hello;
		SpeakNihao nihao;
		hello = new SpeakHello();
		nihao = new SpeakNihao();
		hello.setPriority(10);
		hello.start();
		nihao.start();

		for (int i = 0; i < 15; i++) {
			System.out.println("大家好" + i + "");
		}
	}		
}

三、线程调度和优先级

Java虚拟机中的线程调度器负责管理线程。

调度器把线程分为10个等级,分别用Thread类的常量表示即Thread.MIN_PRIORITYThread.MAX_PRIORITY之间,如果明确声明,系统默认优先度为5,即Thread.NORM_PRIORITY

我们可以通过调用setPriority()方法设置优先度,也可以通过getPriority()得到一个线程的优先度。

但是,不提倡使用线程优先度来确保算法的正确执行,要保证线程在CPU资源不足的情况下,仍能正确运行。

 

四、Thread的子类创建线程

需要重写run()方法,因为父类中的run()方法内没有操作语句。

为了使结果尽量不依赖CPU资源的使用情况,应当让线程主动调用sleep()方法,让出CPU的使用权。

 

示例代码:

People.java

package com.java.study.until;

public class People extends Thread {
	StringBuffer str;
	public People(String sex,StringBuffer str) {
		this.str = str;
		//调用从父类Thread继承的setName()方法为线程起名字。
		setName(sex);
	}
	
	public void run() {
		for(int i = 0;i<3;i++){
			str.append(getName()+",");
			System.out.println("我是"+getName()+"字符串为:"+str);
			try {
				sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

ThreadTest00.java

package com.java.study;

import com.java.study.until.People;

public class ThreadTest00 {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		new People("帅哥",sb).start();
		new People("美女",sb).start();
	}
}

抱歉!评论已关闭.