java多线程理解及实现

Posted yonim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程理解及实现相关的知识,希望对你有一定的参考价值。

 其实多线程也很好理解,就好比我们坐高铁、飞机过安检一样,过安检的时候一个入口只有一个安检口,而多线程就是为安检开启了多个安检口,话不多说贴代码

线程实现的三种方式:

一、继承Thread类创建线程类

  1、定义Thread子类,重写run()方法,把需要做线程操作的类容放入该方法体中。

  2、创建Thread子类的实例,在实例中调用线程对象的start()启动线程方法,此方法也是代表线程数量的方法,需要启动多个线程时,只需要调用多次则以。

package com.thread;
public class FirstThreadTest extends Thread{
  int i = 0;
  //重写run方法,run方法的方法体就是现场执行体
  public void run(){
    for(;i<100;i++){
      System.out.println(getName()+" "+i);
    }
  }
  public static void main(String[] args){
    for(int i = 0;i< 100;i++){
      System.out.println(Thread.currentThread().getName()+" :"+i);
      if(i==20){
        new FirstThreadTest().start();
        new FirstThreadTest().start();
} } }
}

上述代码中Thread.currentThread()方法返回当前正在执行的线程对象,getName()方法返回线程名称。

 

二、通过Runnable接口创建线程类,这也是常用的一种

  1、定义runnable接口实现类,并重写run()方法,此方法跟继承Thread类中的run是一样的

  2、创建实现类的实例,并在实例中创建Thread对象,该对象也是代表线程数量的对象,启动多个线程只需要多次调用对象的start()方法则以。

package com.thread;
public class RunnableThreadTest implements Runnable
{
  private int i;
  public void run()
  {
     for(i = 0;i <100;i++){
       System.out.println(Thread.currentThread().getName()+" "+i);
     }
  }
  public static void main(String[] args){
    for(int i = 0;i < 100;i++){
      System.out.println(Thread.currentThread().getName()+" "+i);
      if(i==20){
        RunnableThreadTest rtt = new RunnableThreadTest();
        new Thread(rtt,"新线程1").start();
        new Thread(rtt,"新线程2").start();
      }
    }
  }
}

三、通过线程池实现多线程,这个是做常用的也是最实用的

   1、通过ExecutorService来管理线程池,并且初始化线程数量

   2、定义队列来存放线程池

   3、循环判断线程是否执行还是睡眠

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThread {

    // 首先初始化ExecutorService线程池,用来管理多线程,设置线程数量
    private static ExecutorService pool = Executors.newFixedThreadPool(50);
    
    // 定义Queue队列,用来存放线程池,Runnable就是线程对象
    private static Queue<Runnable> queue = new ConcurrentLinkedDeque<>();
    
    // 类加载执行多线程
    static {
        (new TestThread()).new ThreadPoolInvoke().start();
    }
            
    private  class ThreadPoolInvoke extends Thread{
        @Override
        public void run() {
            // 死循环一直判断队列
            while (true) {
                try {
                    // 如果为空,线程睡眠3秒
                    if (queue.isEmpty()) {
                        Thread.sleep(1000 * 3);
                    }
                    // 如果不为空则执行任务,定义excute方法
                    excute();
                } catch (Exception e) {
                    // TODO: handle exception
                }
                
            }
        }
    
    }
    /**
     * 设置线程到队列方法
     * @param runnable
     */
    public static void setTask(Runnable runnable) {
        queue.add(runnable);
    }
    
    /**
     * 执行线程任务
     */
    private void excute() {
        //为了确保线程安全,这里可以设置同步锁,this表示当前进入者
        //synchronized (this) {
        // 获取queue队列size    
        int curLen = queue.size();
        for (int i = 0; i < curLen; i++) {
            // poll 方法表示从队列中删除第一个元素
            Runnable item = queue.poll();
            // 然后把对象交给多线程处理        
            pool.execute(item);
        }
        //}
    }
}

好了,今天的多线程分享就到这,是否学会了呢?

以上是关于java多线程理解及实现的主要内容,如果未能解决你的问题,请参考以下文章

synchronized与static synchronized 的差别synchronized在JVM底层的实现原理及Java多线程锁理解

Java并发多线程编程——Condition接口的理解及使用

javaSE第二十三天

Java多线程学习笔记— “如何理解线程及多线程”

如何理解python的多线程编程

java---多线程及线程的概念