Java并发编程--Thread

   Thread中文翻译为线、线索。其实我们的线程就和一条条的线路一样,所以用Thread表示很合适。之前我们编写的代码就一条执行路径,比如下面方法:

 

public static void main(String[] args) {
		hello2 hello=new hello2();
		hello.test1();
		
	}

	public void test1(){
		//......
		test2();
		//......
	}
	public void test2(){
		//......
		test3();
		//......
	}
	private void test3() {
		//......
		//......		
	}


        我们的执行过程是这样的:先执行test1,执行到调用test2方法时要调用test2,test2方法调用test3方法,test3方法执行完返回,test2方法执行完返回,test1方法继续向下执行。可以看到这样的执行是单一的一条线。如图,按箭头顺序:

 

 

如果我们使用多线程的话,执行顺序是这样的:在图中可以看到有4条线路。

 

 

    对线程执行有一个大概的概念后,我们来看一下Thread类。Thread类有一些保存信息的属性,这些属性可以用来标识线程,显示线程的状态或者控制线程的优先级。

ID:保存了线程唯一标识符。

Name:保存线程名称;

Priority:保存线程的优先级。

Status:保存线程状态,在java中线程有6中状态:new 、runnable、blocked、waiting、time wait、terminated。

 

下面我们编写程序为10个线程指定名称和优先级,每个线程将计算一个数字的乘法表,代码如下:

 

Caculator.java

package com.tgb.klx.run.demo;

public class Calculator implements Runnable{
	private int number;
	public Calculator(int number){
		this.number=number;
	}
	public void run(){
		for(int i=1;i<=10;i++){
			System.out.printf("%s : %d * %d = %d\n",Thread.currentThread().getName(),number,i,i*number);
		}
	}
}


Main.java

 

package com.tgb.klx.run.demo;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.Thread.State;

public class Main {

	public static void main(String[] args){
		Thread threads[]=new Thread[10];
		Thread.State status[] =new Thread.State[10];
		
		for(int i=0;i<10;i++){
			threads[i] =new Thread(new Calculator(i));
			if((i%2)==0){
				//设置线程优先级
				threads[i].setPriority(Thread.MAX_PRIORITY);
			}else{
				threads[i].setPriority(Thread.MIN_PRIORITY);
			}
			threads[i].setName("Thread "+i);
		}
		//将线程信息记录到log.txt中
		try(FileWriter file=new FileWriter("E:\\H盘\\高校平台\\ITOOV3.0\\FreshMan\\data\\log.txt");
				PrintWriter pw=new PrintWriter(file);){
			for(int i=0;i<10;i++){
				pw.println("Main: Status of Thread "+i+" : "+threads[i].getState());
			}
			
			for(int i=0;i<10;i++){
				threads[i].start();
			}
			
			boolean finish=false;
			while(!finish){
				for(int i=0;i<10;i++){
					if(threads[i].getState()!=status[i]){
						writeThreadInfo(pw,threads[i],status[i]);
						status[i]=threads[i].getState();
					}
				}
				finish=true;
				for(int i=0;i<10;i++){
					finish=finish &&(threads[i].getState()==State.TERMINATED);
				}
			}
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
		
				
	}
	
	public static void writeThreadInfo(PrintWriter pw,Thread thread,State state){
		pw.printf("Main : Id %d -%s\n", thread.getId(),thread.getName());
		pw.printf("Main : Priority: %d\n", thread.getPriority());
		pw.printf("Main : Old State: %s\n", state);
		pw.printf("Main : New State: %s\n", thread.getState());
		pw.printf("Main : *****************************\n");
	}
}

打印结果:


log.txt:

 

     注意:我们通过可以给线程设置名字,优先级。但是线程的ID和状态是不允许被修改的。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值