Java 多线程基础汇总

### 第一题:

/**  
 *   1、经典多线程题目。
 *   
 *  启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 
 *  然后是线程3打印11,12,13,14,15. 
 *  接着再由线程1打印16,17,18,19,20….以此类推, 直到打印到75
 * */
public class Thread02 {
 
    
      public static void main(String[] args) {
          
          Object obj = new Object();
          new Thread(new PrintRunnable(obj,1)).start();
          new Thread(new PrintRunnable(obj,2)).start();
          new Thread(new PrintRunnable(obj,3)).start();
          
          
    }
}

class  PrintRunnable implements Runnable{
    //volatile在这里可加可不加。我试了几次,结果都是对的。
    
      private volatile static int printNum = 0;
      
      private Object o;
      
      private int threadId ;
      
      
      public PrintRunnable(Object o, int threadId) {
        
        this.o = o;
        this.threadId = threadId;
    }


    public void run(){
             
        synchronized(o){
            
            while(printNum<75){

            //这个算法不错。
                 if(printNum/5%3+1==threadId){
                     for(int i=0;i<5;i++){
                        // printNum++;
                         System.out.println("线程"+threadId+":"+(++printNum));
                    
                     }
                     o.notifyAll();
                     
                 }else{
                     try {
                         //wait方法的含义:就是调用此方法后,此线程处于阻塞,
                         //直到它被唤醒,唤醒后,就继续执行wait方法后的语句。而不会
                         //再执行if里的语句了。要理解哈。
                         
                        o.wait();
                        
                    //    System.out.println(threadId+":等待");
                    } catch (InterruptedException e) {
                        
                        e.printStackTrace();
                    }
                     
                 }
                
            }
            
            
        }
        
          
      }
}

 

##  第二题:

/** 
 * 
 *  2、现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
 *  */
public class Thread03 {
 
    
     public static void main(String[] args) {
        Thread03.method02();
        
         
    }
     
     private static void method02(){
            Runnable runnable = new Runnable() {
                @Override public void run() {
                    System.out.println(Thread.currentThread().getName() + "执行完成");
                }
            };
            //在非main方法中也可以new对象啊。
            Thread t1 = new Thread(runnable, "t1");
            Thread t2 = new Thread(runnable, "t2");
            Thread t3 = new Thread(runnable, "t3");
            try {
                t1.start();
                //此处的join方法表示一定会在t2线程先执行完。
                
                t1.join();
                t2.start();
                
              
                t2.join();
                t3.start();
                t3.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
     }
}


## 第三题:

 public static void main(String[] args) {
          
          //3、编写10个线程,第一个线程从1加到10,第二个线程从11加到20.....第十个线程从91加到100,
          //最后再把10个线程结果相加。
          Object obj = new Object();
          
          for(int i=0;i<10;i++){
              new ThreadZhou(obj,(i+1)).start();
          }
        
    }
}

//
class ThreadZhou extends Thread{
      private static int sum=0;
      
      private int threadId;
      
      private Object obj;
      private static int num=0;
      //一定要加上static
     static private int[] arr = new int[10];
      
      public ThreadZhou(Object obj,int threadId){
          this.obj = obj;
                  
          this.threadId = threadId;
      }
     
       public void run(){
           
             synchronized(obj){
                 
                 while(num<100){
                      if(num/10%10+1==threadId){
                           for(int i=0;i<10;i++){
                               num++;
                               arr[threadId-1]+=num;
                              
                           }
                           System.out.println((threadId-1)+":"+arr[threadId-1]);
                            if(num==100){
                                
                                 for(int j=0;j<arr.length;j++){
                                     //气死我了。??结果不对??
                                      System.out.println("j:"+arr[j]);
                                      sum+=arr[j];
                                  }
                                  System.out.println("sum:"+sum);
                            }
                          obj.notifyAll();
                      }else{
                          try {
                              
                            obj.wait();
                        } catch (InterruptedException e) {
                            
                            e.printStackTrace();
                        }
                          
                      } 
                     
                 }
                 /*if(num==100){
                     
                 }*/
                /* if(num==100){
                        
                     System.out.print("\n");
                     for(int j=0;j<arr.length;j++){
                         //气死我了。??结果不对??
                          System.out.println("j:"+arr[j]);
                          sum+=arr[j];
                      }
                      System.out.println("sum:"+sum);
                }*/
                 
             }
       }
}
 

##第四题:

生产者、消费者情形,之前也看到过,没有研究,今日花了点时间理解了哈。大有裨益。棒棒的。

有个共享资源类,Person类。

public class Person {
 
    
     private String name;
     
     private int age;
     //表示共享资源对象是否为空,如果为true,表示需要生产,如果为false,表示有数据了,不要生产。
     private boolean isEmpty=true;
     
     public synchronized void push(String name,int age){
         try {
         if(!isEmpty){
            
                this.wait();
            } 
         
         //
         this.name = name;
         this.age = age;
         
         isEmpty = false;
         
         System.out.println("person:"+this);
         this.notifyAll();
           }catch (InterruptedException e) {
                
                e.printStackTrace();
            }         
            
     }
     
     //取数据
     public synchronized void pop(){
         try{
             
             if(isEmpty){
                 this.wait();
                 
             }
             
             System.out.println(this.name+"---"+this.age);
             
             isEmpty = true;
             this.notifyAll();
             
         }catch(InterruptedException e){
             e.printStackTrace();
             
         }
     }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
     
     
}
  

再写个类Thread05。调用main方法。就是多线程中的生产者-消费者模型了。

public class Thread05 {
 
    
     public static void main(String[] args) {
         
         Person p = new Person();
         
         Runnable producer = new Producer(p);
         Runnable consumer = new Consumer(p);
         
         Thread pro = new Thread(producer);
         Thread con = new Thread(consumer);
         
         pro.start();
         con.start();
         
         
    }
}

class Producer implements Runnable{
    
     Person p = null;
     
     public Producer(Person p){
         this.p = p;
         
     }
        
     public void run(){
         
          for(int i=0;i<50;i++){
              if(i%2==0){
                  p.push("Tom", 11);
                  
              }else{
                  p.push("Marry", 20);
              }
          }
     }
}

class Consumer implements Runnable{
    
      Person p = null;
      
      public Consumer(Person p){
          this.p = p;
      }
      
      public void  run(){
          
          for(int i=0;i<50;i++){
              p.pop();
              
          }
      }
}

## 第五题:

这个例子是演示wait方法与notify方法,即多线程通信的简单的例子。

 

public class ThreadWait01 {
 
    
      public static void main(String[] args) {
          
          Object obj = new Object();
          Thread t1 = new Wait(obj);
          
          Thread t2 = new   Notify(obj);
          
          t1.start();
          t2.start();
          
          
    }
}

class Wait extends Thread{
     private Object obj;
     
     public Wait(Object obj){
           this.obj = obj;
     }
    
      public void run(){
          
          
         
               //模拟尽量让Wait类先执行。
          //Thread.sleep(1000);
            Thread.yield();
        
           
          synchronized(obj){
              for(int i=0;i<30;i++){
                  Example.i++;
                  
                  if(i==11){
                      obj.notify();
                      System.out.println("已经发出唤醒消息了");
                  }
                  
                  System.out.println("i:"+i);
              }
              
          }
         
          
      }
     
}

class  Notify extends Thread{
      private Object obj;
      
      public Notify(Object obj){
          this.obj = obj;
      }
      
       public void run(){
           
            synchronized(obj){
                if(Example.i!=11){
                    try {
                        System.out.println("wait start");
                        obj.wait();
                        
                        System.out.println("wait end");
                    } catch (InterruptedException e) {
                        
                        e.printStackTrace();
                    }
                    
                }
            }
           
       }
    
}

class Example{
    
      static int i=0;
      
}

完结。

 

 

Java多线程结果汇总是指将多个线程并发执行的结果进行汇总和合并。在多线程编程中,我们常常需要将每个线程的计算结果进行累加、合并或者统计等操作,从而得到最终的结果。 一种常见的做法是使用线程池来管理线程的执行。我们可以将任务分解为多个子任务,每个子任务由一个线程来执行。线程池会自动管理线程的创建、执行和销毁,确保我们可以高效地使用线程资源。每个线程计算完毕后,将结果返回给线程池,线程池就可以将这些结果进行合并、汇总,得到最终的结果。 另一种常见的方法是使用Future和Callable来获取线程的执行结果。Callable是一个带有返回值的任务,我们可以使用它来定义每个子任务的逻辑。将Callable提交给线程池后,会返回一个Future对象,我们可以通过该对象获取线程执行的结果。Future提供了方法来判断任务是否已经完成、获取任务的结果等操作。通过迭代每个Future对象,可以将所有的结果进行汇总和合并。 除了线程池和Future,还可以使用线程间的通信来实现结果汇总。比如,可以使用共享变量、信号量、锁等机制来实现各个线程之间的同步和通信。每个线程将计算结果保存在共享变量中,其他线程根据需要读取这些结果,并在必要时进行合并。 无论使用哪种方法Java多线程结果汇总都需要考虑线程安全性。多个线程同时操作共享的数据结构,可能会引发并发问题,如线程安全、死锁等。为了保证结果的正确性和一致性,我们需要使用适当的同步机制来确保线程的顺序执行和结果的正确性。 总之,通过线程池和Future、线程间通信等手段,可以有效地实现Java多线程结果的汇总和合并,从而提高程序的性能和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值