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