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

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

原文地址:https://www.cnblogs.com/yonim/p/11417598.html

时间: 2024-11-09 06:11:08

java多线程理解及实现的相关文章

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

Java多线程理解(线程安全)

我们在使用Java多线程时,一定需要考虑到共享,线程安全的相关内容.以下通过几个例子帮助大家来理解多线程时如何运行的,后续通过一篇文章详述解决办法:synchronized. 场景1: 第一次运行结果: [当前线程]----------one=====实例变量的值----x=1 [当前线程]----------two=====实例变量的值----x=2 [当前线程]----------two=====实例变量的值----x=3 [当前线程]----------two=====实例变量的值----

java多线程理解与实现方式

1.通过继承thread类,覆写run方法来实现多线程. 1 public class Mytest { 2 public static void main(String[] args) { 3 Thread myThread1 = new MyThread1(); 4 Thread myThread2 = new MyThread1(); 5 //调用start方法 6 myThread1.start(); 7 myThread2.start(); 8 //调用run方法 9 //myThre

java多线程理解2

1. 什么时候必须同步?什么叫同步?如何同步? 要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见另一个线程做的更改. 为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的.这归因于java语言规范的内存 模型 小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致 2. 什么叫原子的(原子操作)? Java原子操作是指:不会被打断地的操作.(就是做到互斥和可见性?

Java多线程理解

首先说一下进程和线程的区别 进程:是计算机运用程序实例,拥有独立的内存空间和数据(猜测内存堆应该是作用的进程上),一个进程包含多个子线程,不同进程相互独立: 线程:cpu执行的基本单位,拥有独立的寄存器和栈,同一进程下的线程共享地址&内存空间:线程栈存放方法的栈帧,每次方法执行都会新建栈帧压到栈顶,当线程中某个请求大小超过限制则提示StackOverflowError,当需要存储一个新的栈帧且栈内存不足则抛出OutOfMemoryError:栈帧包含局部变量.返回值.方法引用的常量池(栈帧只能存

Java多线程-----理解CountDownLatch

   CountDownLatch简介  CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier.Semaphore.ConcurrentHashMap和BlockingQueue,它们都存 在于java.util.concurrent包下.CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行 CountDownLatch工作原理 CountDownLatch.java类中定义的构造

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

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

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

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

本Blog分为如下部分: 第一部分:synchronized与static synchronized 的区别 第二部分:JVM底层又是如何实现synchronized的 第三部分:Java多线程锁,源代码剖析 第一部分:synchronized与static synchronized的区别 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是"类