乘法表运算显示在控制台上,每个线程的状态改变记录在log.txt中。
代码如下:
package sec01;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
//线程信息的获取和设置
public class Calculator2 implements Runnable {
private int number;
public Calculator2(int number){
this.number = number;
}
//编写writeThreadInfo()方法,用于写下线程的ID、名称、优先级、旧状态和新状态
private static void writeThreadInfo(PrintWriter pw, Thread thread,Thread.State state){
pw.write("Main : Id "+thread.getId()+" - "+thread.getName()+"\n");
pw.write("Main : Priority: "+thread.getPriority()+"\n");
pw.write("Main : Old State: "+state+"\n");
pw.write("Main : New State: "+thread.getState()+"\n");
pw.write("Main : ***************************\n");
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int i =1; i<=10;i++){ //循环与number相乘并打印
System.out.printf("%s: %d * %d = %d\n", Thread.currentThread().getName(),number,i,i*number);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread threads[] = new Thread[10]; //存放线程对象
Thread.State status[] = new Thread.State[10]; //存放线程运行状态
for(int i=0; i<10; i++){
threads[i] = new Thread(new Calculator2(i)); //创建线程对象
if(i%2==0){
threads[i].setPriority(Thread.MAX_PRIORITY); //设置线程为最高优先级
}else {
threads[i].setPriority(Thread.MIN_PRIORITY); //设置线程为最低优先级
}
threads[i].setName("thread"+i); //设置线程名
}
//创建用于写入线程状态记录文件的对象
try {
PrintWriter printWriter = new PrintWriter(".\\sec01\\log.txt");//记录文件路径
for(int i=0; i<10; i++){
status[i] = threads[i].getState();
printWriter.write("Main : status of Thread "+" : "+i+ " : "+status[i]+"\n");
}
//开始执行10个线程
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(printWriter, threads[i], status[i]);
status[i] = threads[i].getState();
}
}
finish=true;
for(int i=0; i<10; i++){//直到10个线程均执行完毕,finish才为true
finish = finish && (threads[i].getState()==Thread.State.TERMINATED); //若线程执行结束,则finish置为true
}
}
printWriter.flush();
printWriter.close();
} catch (IOException e) {
// TODO Auto-g