学习笔记2:java中Thread类与线程的建立

线程 是程序中的执行线程。Java 虚拟机容许应用程序并发地运行多个执行线程。java

每一个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每一个线程均可以或不能够标记为一个守护程序。当某个线程中运行的代码建立一个新 Thread 对象时,该新线程的初始优先级被设定为建立线程的优先级,而且当且仅当建立线程是守护线程时,新线程才是守护程序。安全

当 Java 虚拟机启动时,一般都会有单个非守护线程(它一般会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一状况出现时为止:并发

  • 调用了 Runtime 类的 exit 方法,而且安全管理器容许退出操做发生。ide

  • 非守护线程的全部线程都已中止运行,不管是经过从对 run 方法的调用中返回,仍是经过抛出一个传播到 run 方法以外的异常。线程

建立新执行线程有两种方法:code

1):    一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来能够分配并启动该子类的实例。对象

public class DemoThread1 {
	/**
	 * @author 牧羊的伯格女皇
	 * @param args
	 * date:2015-10-15
	 */
	public static void main(String[] args) {  //主线程负责执行main方法
		SpeakDog dog = new SpeakDog();  // 建立线程
		SpeakPig pig = new SpeakPig();  //建立线程
		dog.start();  // 启动线程
		pig.start();  // 启动线程 
		for( int i=1;i<=10;i++){
			System.out.print("羊 "+i+" ");
		}
	}
}


public class SpeakDog extends Thread { // Thread类的子类
	@Override
	public void run() {
		for( int i=1; i<=5; i++){
			System.out.print("狗 "+i+" ");
		}
	}
}


public class SpeakPig extends Thread {
	@Override
	public void run() {
		for( int i=1;i<=7;i++){
			System.out.print("猪 " + i +" ");
		}
	}
	
}

//上述中JVM让 dog , pig , main 线程轮流使用cpu资源。
//只有当程序中的全部线程结束了,JVM才结束java程序的执行。
//不足: 上述程序在不一样的而计算机运行或在同一台计算机反复运行的结果不尽相同,由于输出结果引来与当前CPU资源的使用状况。

2) 建立线程的另外一种方法是声明实现 Runnable 接口的类。该类而后实现 run 方法。而后能够分配该类的实例,在建立 Thread 时做为一个参数来传递并启动。接口

Thread(Runnable target)
分配新的Thread对象
public class DemoThread2 {
	public static void main(String[] args) {
		Thread speakdog;   //用Thread声明线程
		Thread speakpig;   //用Thread声明线程
		SpeakDog dog;   // dog 是目标对象
		SpeakPig pig;   // pig是目标对象
		dog = new SpeakDog();  //建立目标对象
		pig = new SpeakPig();  // 建立目标对象
		speakdog = new Thread(dog);  //建立线程 其目标对象是 dog
		speakpig = new Thread(pig);   //建立线程 其目标对象是pig
		speakdog.start();  //启动线程
		speakpig.start();  //启动线程
		
		for( int i=1; i<=10;i++){
			System.out.print("羊 " + i +" ");
		}
	}
}

public class SpeakDog implements Runnable {
	@Override
	public void run() {
		for( int i=1; i<=5; i++ ){
			System.out.print("狗 "+ i + " ");
		}
	}

}


public class SpeakPig implements Runnable {

	@Override
	public void run() {
		for( int i=1; i<=7; i++ ){
			System.out.print("猪 "+ i + " ");
		}
	}

}


线程间能够共享相同的内存单元(包括代码与数据) 并利用这些共享单元来实现数据交换,实时通讯与必要的同步操做。内存

对于Thread(Runnable target)构造方法建立线程时,轮到它来想用CPU资源时,目标对象后就会自动调用接口中的run()方法,所以,对于使用同一目标对象的线程,目标对象的成员变量天然就是这些线程共享的数据单元。资源

另外,建立目标对象的类在必要时还能够是某个特定的子类,所以,使用Runnable接口比使用Thread的子类更具备灵活性。

public class MyThread extends OtherClass implements Runnable {  
  public void run() {  
   System.out.println("MyThread.run()");  
  }  
}


//当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run(),参考JDK源代码:
public void run() {  
  if (target != null) {  
   target.run();  
  }  
}
相关文章
相关标签/搜索