线程的执行顺序

   今天被下面两个小程序纠结了大半天,终于在刚刚的某个时刻想明白是怎么回事了,  问题主要是线程的流程没有理解清楚,现在将线程的创建与执行顺序清理一遍

   

 

线程的创建:

1,线程:线程的创建继承Thread     class ThreadDemo extends Thread{ }

 

2,重写 public void  run(){ }的方法

 

3,在数函数中实例化线程类   ,再用实例化的类来启动线程

 

ThreadDemo 类名称 extends Thread // 从Thread类扩展出子类
{
属性
方法…
修饰符 run(){ // 复写Thread类里的run()方法
以线程处理的程序;
}
}

 

 

线程的执行顺序;

   1,主函数启动线程

 

   2, start()启动run方法

   

 

 

 

创建一个线程类,统计现在的名字和使用的是第几个线程   :
package com.com;
//创建线程的主函数
public class ThreadDemo2 {
	//将统计线程个数的类实例化
	  Count count = new Count();
	public static void main(String args[]){
		//创建启动线程的
		ThreadRun t1 = new ThreadRun();
		ThreadRun t2 = new ThreadRun();
		//设置线程的名字
		t1.setName("t1");
		t2.setName("t2");
		//启动线程
		t1.start();
		t2.start();	
	}
}

//创建线程THreadRun的类和方法
class ThreadRun extends Thread{
	public  void run(){
		//Thread.currentThread是获取当前线程  
		Count.add(Thread.currentThread().getName());
	}
}

//创建统计线程个数的类
class Count{
	//定义当前线程
	private static int num = 0;
	 public String name;
	public static void add(String name){
		num++;
		try{
			System.out.println(name+",您是第"+num+"个使用Count的线程!");
		Thread.sleep(1);
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}
}
 

 

运行结果:
t1,您是第1个使用Count的线程!
t2,您是第2个使用Count的线程!

 

 分析执行 :    

1,创建Count类中的方法

 2,主函数创建线程,

3,设置线程的名字

4,通知run方法准备启动线程

5,在run方法中获得的名字传给add()方法

6,执行一个num++

7,打印出当前线程的名字和第几个线程

 

 

//创建线程类给a赋值:

package com.com;
/**
 * 测试线程
 * 
 * @author Administrator
 * 
 */

public class ThreadDemo {
	public static void main(String args[]) {
		//创建线程对象
		RunThread  thread = new RunThread();
		//RunThread  threadrun = new RunThread();
		//启动线程
		thread.start();
		//threadrun.start();
	}

}

// 定义内部类
class RunThread extends Thread {

	int a = 100;
	//定义m1的方法
	public void m1(){
		a = 1000;
		try {
			Thread.sleep(2000);
			System.out.println("a m1 ="+a );
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//定义M2的方法
	public void m2(){
		a = 2000;
		try {
			Thread.sleep(2000);
			System.out.println("a m2 ="+a );
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
	}
//线程的run方法
	public void run() {
		while (true) {
			m1();
			m2();
			try {
				Thread.sleep(1000);
				System.out.println("a run ="+a );
			} catch (Exception e) {
				e.printStackTrace();
				
			}
		}
	}
}

 

 

 

运行结果:
a m1 =1000
a m2 =2000
a run =2000

 

 

分析执行: 主函数中创建线程对象,启动线程,先执行完run中的们m1方法---->再执行m2()方法--->再打印出try-catch中a的值

 

 

 

你可能感兴趣的:(线程,程序执行流程)