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