Java多线程机制--Java中的线程
一、首先理解程序、进程与线程的关系(略,需个人思考理解)。
其中每个进程都有一段专用的内存区域,但是线程之间可以共享相同的内存单元,利用这些共享单元实现数据交换,实时通信和必要的同步操作。
二、线程的状态和生命周期
1、新建
Thread类或者其子类被声明时,已经分配相应的内存空间和资源。但JVM(java虚拟机)尚未将CPU的使用权分给它。
2、运行
线程通过调用start()方法,通知JVM此线程进入等待使用CPU的队列中。
当JVM将CPU使用权切换给这个线程时,就会运行类内的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_PRIORITY和Thread.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(); } }