当前位置:   article > 正文

Java并发编程--Thread_thread[] threads = new thread[3]; for(int i = 0;i<

thread[] threads = new thread[3]; for(int i = 0;i<3;i++) { threads[i] = new

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

 

  1. public static void main(String[] args) {
  2. hello2 hello=new hello2();
  3. hello.test1();
  4. }
  5. public void test1(){
  6. //......
  7. test2();
  8. //......
  9. }
  10. public void test2(){
  11. //......
  12. test3();
  13. //......
  14. }
  15. private void test3() {
  16. //......
  17. //......
  18. }


        我们的执行过程是这样的:先执行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

  1. package com.tgb.klx.run.demo;
  2. public class Calculator implements Runnable{
  3. private int number;
  4. public Calculator(int number){
  5. this.number=number;
  6. }
  7. public void run(){
  8. for(int i=1;i<=10;i++){
  9. System.out.printf("%s : %d * %d = %d\n",Thread.currentThread().getName(),number,i,i*number);
  10. }
  11. }
  12. }


Main.java

 

  1. package com.tgb.klx.run.demo;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.lang.Thread.State;
  6. public class Main {
  7. public static void main(String[] args){
  8. Thread threads[]=new Thread[10];
  9. Thread.State status[] =new Thread.State[10];
  10. for(int i=0;i<10;i++){
  11. threads[i] =new Thread(new Calculator(i));
  12. if((i%2)==0){
  13. //设置线程优先级
  14. threads[i].setPriority(Thread.MAX_PRIORITY);
  15. }else{
  16. threads[i].setPriority(Thread.MIN_PRIORITY);
  17. }
  18. threads[i].setName("Thread "+i);
  19. }
  20. //将线程信息记录到log.txt中
  21. try(FileWriter file=new FileWriter("E:\\H盘\\高校平台\\ITOOV3.0\\FreshMan\\data\\log.txt");
  22. PrintWriter pw=new PrintWriter(file);){
  23. for(int i=0;i<10;i++){
  24. pw.println("Main: Status of Thread "+i+" : "+threads[i].getState());
  25. }
  26. for(int i=0;i<10;i++){
  27. threads[i].start();
  28. }
  29. boolean finish=false;
  30. while(!finish){
  31. for(int i=0;i<10;i++){
  32. if(threads[i].getState()!=status[i]){
  33. writeThreadInfo(pw,threads[i],status[i]);
  34. status[i]=threads[i].getState();
  35. }
  36. }
  37. finish=true;
  38. for(int i=0;i<10;i++){
  39. finish=finish &&(threads[i].getState()==State.TERMINATED);
  40. }
  41. }
  42. } catch (IOException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. public static void writeThreadInfo(PrintWriter pw,Thread thread,State state){
  47. pw.printf("Main : Id %d -%s\n", thread.getId(),thread.getName());
  48. pw.printf("Main : Priority: %d\n", thread.getPriority());
  49. pw.printf("Main : Old State: %s\n", state);
  50. pw.printf("Main : New State: %s\n", thread.getState());
  51. pw.printf("Main : *****************************\n");
  52. }
  53. }

打印结果:


log.txt:

 

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/220803
推荐阅读
  

闽ICP备14008679号