JAVA 并发编程之线程管理2

今天,我们注重分析下Thread类。这个类有一些信息的属性。这些属性可以用来标识线程,显示线程的状态或者控制线程的优先级。

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

Name:保存了线程的名称

Priority:保存了线程的优先级。

Status:保存了线程的状态。java中线程的状态有:new,runnable,blocked,waiting,time waiting或者terminated.

现在,编写一个程序为10个线程指定名称和优先级,并且输出他们的状态信息直到线程结束。每个线程都将计算一个数字的乘法表。

1.创建一个名为Calculator的类,并实现了Runnable接口。

public class Calculator  implements Runnable{}

2.声明一个名int类型私有变量number,并编写类的构造器,来为属性number设置值。

private int number;
       public Calculator(int number){
           this.number=number;
   }

3.编写run方法。这个方法来执行我们创建线程的指令。

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);
           }
   }

4.编写一个名为Main的主类。同时创建main()方法。

public class Main {
    public static void main(String[] args){}}

5.创建一个容量为10的线程数组,用来存储线程;创建一个容量为10的Thread.Status数组,以用来存放这10个线程运行的状态。

Thread threads[]=new Thread[10];
    Thread.State status[]=new Thread.State[10];

6.创建一个容量为10的Calculator对象数组,为每个对象都设置不同的数字,然后用他们作为Thread构造器的参数来创建10个线程对象,并且将5个线程优先级设置为最高,另外5个线程优先级设置为最低。

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);
            }
  7.创建一个PrintWriter对象,用来把线程的状态演变写入到文件中。

try(FileWriter file=new FileWriter(".\\data\\log.txt");
                 PrintWriter pw=new PrintWriter(file);){

8.把这10个线程的状态写入到文件中,现有的线程状态都是NEW,

for(int i=0;i<10;i++){
                         pw.println("Main : Status of Thread"+i+":"
                                 +threads[i].getState());
                         status[i]=threads[i].getState();
                     }

9.开始执行这个10个线程

for(int i=0;i<10;i++){
                         threads[i].start();
                     }
  10.直到10个线程都运行完成,我们可以查看他们的状态。所有任务一个线程的状态发生了变化,我们就会讲它写入文件中

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);
                     }
                    
                 }

11.编写writerThreadInfo()方法,用来写下线成的ID,名称,优先级,旧的状态和新的状态。

private 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");
    }

12.运行结果:

Main : Status of Thread0:NEW

Main : Status of Thread1:NEW

Main : Status of Thread2:NEW

Main : Status of Thread3:NEW

Main : Status of Thread4:NEW

Main : Status of Thread5:NEW

Main : Status of Thread6:NEW

Main : Status of Thread7:NEW

Main : Status of Thread8:NEW

Main : Status of Thread9:NEW

Main : Id 9 - Thread0
Main : Priority: 10
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 10 - Thread1
Main : Priority: 1
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 11 - Thread2
Main : Priority: 10
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 12 - Thread3
Main : Priority: 1
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 13 - Thread4
Main : Priority: 10
Main : Old State: NEW
Main : New State: RUNNABLE
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 15 - Thread6
Main : Priority: 10
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 16 - Thread7
Main : Priority: 1
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 17 - Thread8
Main : Priority: 10
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: NEW
Main : New State: BLOCKED
Main : ************************************
Main : Id 10 - Thread1
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 13 - Thread4
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: BLOCKED
Main : ************************************
Main : Id 9 - Thread0
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 13 - Thread4
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 12 - Thread3
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 11 - Thread2
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 11 - Thread2
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 17 - Thread8
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 16 - Thread7
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 17 - Thread8
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 17 - Thread8
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 12 - Thread3
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 12 - Thread3
Main : Priority: 1
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 9 - Thread0
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 9 - Thread0
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 10 - Thread1
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 15 - Thread6
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 10 - Thread1
Main : Priority: 1
Main : Old State: RUNNABLE
Main : New State: BLOCKED
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 15 - Thread6
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: BLOCKED
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: RUNNABLE
Main : New State: BLOCKED
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 15 - Thread6
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: BLOCKED
Main : ************************************
Main : Id 10 - Thread1
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 15 - Thread6
Main : Priority: 10
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 15 - Thread6
Main : Priority: 10
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 14 - Thread5
Main : Priority: 1
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 18 - Thread9
Main : Priority: 1
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 16 - Thread7
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************
Main : Id 16 - Thread7
Main : Priority: 1
Main : Old State: RUNNABLE
Main : New State: TERMINATED
Main : ************************************
Main : Id 10 - Thread1
Main : Priority: 1
Main : Old State: BLOCKED
Main : New State: RUNNABLE
Main : ************************************

时间: 2024-12-18 04:03:01

JAVA 并发编程之线程管理2的相关文章

【转】Java并发编程:线程池的使用

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool

Java并发编程:线程池的使用(转)

Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 在Java中可以通过线程池来达到这样的效果.今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPool

Java并发编程:线程的同步

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

Java并发编程:线程的创建

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去.因此,一般情况下,当队列满时,会让生产者交出对

Java 并发编程:线程间的协作(wait/notify/sleep/yield/join)

Java并发编程系列[未完]: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) 一.线程的状态 Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态). New:新建状态,当线程创建完成时为新

JAVA并发编程3_线程同步之synchronized关键字

在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public class Test implements Runnable { private int i = 0; private int getNext() { return i++; } @Override public void run() { // synchronized while (true) { synchro

JAVA并发编程4_线程同步之volatile关键字

上一篇博客JAVA并发编程3_线程同步之synchronized关键字中讲解了JAVA中保证线程同步的关键字synchronized,其实JAVA里面还有个较弱的同步机制volatile.volatile关键字是JAVA中的轻量级的同步机制,用来将变量的更新操作同步到其他线程.从内存可见性的角度来说,写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块. 旧的内存模型:保证读写volatile都直接发生在main memory中. 在新的内存模型下(1.5)

Java并发编程之线程池

一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(BlockingQueue),线程池里的线程会去取这个队列里的任务. 利用线程池有三个好处: 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度.当任务到达时,任务可以不需要的等到线程创建就能立即执行 提高线程的可管理性.线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,