「java线程管理类」Java 线程管理

博主:adminadmin 2023-01-10 02:45:07 844

今天给各位分享java线程管理类的知识,其中也会对Java 线程管理进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

写出java多线程程序设计中常用类及方法名,并分别说明它们的作用。

Thread类

System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类

Mutex类

当两个或更多线程需要同访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex是同步基元,它只向一个线程授予对共享资源的独占访问权。

ReaderWriterLock类

ReaderWriterLock类定义支持单个写线程和多个读线程锁,用于同步对资源的访问。在任一特定时刻,它允许多个线程同时进行读访问,或者允许单个线程进行写访问。在资源不经常发生更改情况下,ReaderWriterLock类所提供的吞吐量比简单的一次只允许一个线程的锁更高。

ThreadPool类

如果有多个任务需要完成,每个任务需要一个线程,这时应该考虑使用线程池来更有效地管理计算机资源并且从中受益。线程池是执行的多个线程集合,它允许系统添加以线程自动创建和开始的任务到队列中,使用线程池使得系统可以优化线程在CPU使用时的时间碎片。但是要记住在任何特定的时间点,每一个进程一每个线程池只有一个个正在运行的线程。使用ThreadPool类可以使得由线程组成的池可以被系统管理,而使开发人员主要精力集中在工作流的逻辑,而不是线程管理上。

WaitHandle类

WaitHandle类封装等待共享资源的独占访问权的操作系统特定的对象,通常用做同步对象的基类。从该类派生的类定义一个信号传输机制以指示获取或释放对共享资源的独占访问,但使用继承的WaitHandle方法在等待对共享资源的访问时阻塞。使用此类的静态方法阻塞刈割线程,直到一个或多个同步对象接收到信息。

AutoResetEent类

AutoResetEvent类通知正在等待的线程已发生事件,无法继承此类。AutoResetEvent类允许线程通过发信号互相通信,通常此通信涉及线程需要独占访问的资源。

AutoResetEvent类将始终保持终止,直到一个正在等待的线程被释放,此时系统将自动把状态设置为非终止状态。如果没有任何线程丰等待,则状态将保持为终止状态。

java线程池怎么实现的

线程池简介:

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。

假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。

如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。

一个线程池包括以下四个基本组成部分:

1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;

2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。

线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子:

假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。

代码实现中并没有实现任务接口,而是把Runnable对象加入到线程池管理器(ThreadPool),然后剩下的事情就由线程池管理器(ThreadPool)来完成了

package mine.util.thread;  

  

import java.util.LinkedList;  

import java.util.List;  

  

/** 

 * 线程池类,线程管理器:创建线程,执行任务,销毁线程,获取线程基本信息 

 */  

public final class ThreadPool {  

    // 线程池中默认线程的个数为5  

    private static int worker_num = 5;  

    // 工作线程  

    private WorkThread[] workThrads;  

    // 未处理的任务  

    private static volatile int finished_task = 0;  

    // 任务队列,作为一个缓冲,List线程不安全  

    private ListRunnable taskQueue = new LinkedListRunnable();  

    private static ThreadPool threadPool;  

  

    // 创建具有默认线程个数的线程池  

    private ThreadPool() {  

        this(5);  

    }  

  

    // 创建线程池,worker_num为线程池中工作线程的个数  

    private ThreadPool(int worker_num) {  

        ThreadPool.worker_num = worker_num;  

        workThrads = new WorkThread[worker_num];  

        for (int i = 0; i  worker_num; i++) {  

            workThrads[i] = new WorkThread();  

            workThrads[i].start();// 开启线程池中的线程  

        }  

    }  

  

    // 单态模式,获得一个默认线程个数的线程池  

    public static ThreadPool getThreadPool() {  

        return getThreadPool(ThreadPool.worker_num);  

    }  

  

    // 单态模式,获得一个指定线程个数的线程池,worker_num(0)为线程池中工作线程的个数  

    // worker_num=0创建默认的工作线程个数  

    public static ThreadPool getThreadPool(int worker_num1) {  

        if (worker_num1 = 0)  

            worker_num1 = ThreadPool.worker_num;  

        if (threadPool == null)  

            threadPool = new ThreadPool(worker_num1);  

        return threadPool;  

    }  

  

    // 执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定  

    public void execute(Runnable task) {  

        synchronized (taskQueue) {  

            taskQueue.add(task);  

            taskQueue.notify();  

        }  

    }  

  

    // 批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定  

    public void execute(Runnable[] task) {  

        synchronized (taskQueue) {  

            for (Runnable t : task)  

                taskQueue.add(t);  

            taskQueue.notify();  

        }  

    }  

  

    // 批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定  

    public void execute(ListRunnable task) {  

        synchronized (taskQueue) {  

            for (Runnable t : task)  

                taskQueue.add(t);  

            taskQueue.notify();  

        }  

    }  

  

    // 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁  

    public void destroy() {  

        while (!taskQueue.isEmpty()) {// 如果还有任务没执行完成,就先睡会吧  

            try {  

                Thread.sleep(10);  

            } catch (InterruptedException e) {  

                e.printStackTrace();  

            }  

        }  

        // 工作线程停止工作,且置为null  

        for (int i = 0; i  worker_num; i++) {  

            workThrads[i].stopWorker();  

            workThrads[i] = null;  

        }  

        threadPool=null;  

        taskQueue.clear();// 清空任务队列  

    }  

  

    // 返回工作线程的个数  

    public int getWorkThreadNumber() {  

        return worker_num;  

    }  

  

    // 返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数,可能该任务并没有实际执行完成  

    public int getFinishedTasknumber() {  

        return finished_task;  

    }  

  

    // 返回任务队列的长度,即还没处理的任务个数  

    public int getWaitTasknumber() {  

        return taskQueue.size();  

    }  

  

    // 覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数  

    @Override  

    public String toString() {  

        return "WorkThread number:" + worker_num + "  finished task number:"  

                + finished_task + "  wait task number:" + getWaitTasknumber();  

    }  

  

    /** 

     * 内部类,工作线程 

     */  

    private class WorkThread extends Thread {  

        // 该工作线程是否有效,用于结束该工作线程  

        private boolean isRunning = true;  

  

        /* 

         * 关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待 

         */  

        @Override  

        public void run() {  

            Runnable r = null;  

            while (isRunning) {// 注意,若线程无效则自然结束run方法,该线程就没用了  

                synchronized (taskQueue) {  

                    while (isRunning  taskQueue.isEmpty()) {// 队列为空  

                        try {  

                            taskQueue.wait(20);  

                        } catch (InterruptedException e) {  

                            e.printStackTrace();  

                        }  

                    }  

                    if (!taskQueue.isEmpty())  

                        r = taskQueue.remove(0);// 取出任务  

                }  

                if (r != null) {  

                    r.run();// 执行任务  

                }  

                finished_task++;  

                r = null;  

            }  

        }  

  

        // 停止工作,让该线程自然执行完run方法,自然结束  

        public void stopWorker() {  

            isRunning = false;  

        }  

    }  

}

什么是java线程池

多线程是为了能够让计算机资源合理的分配,对于处理不同的任务创建不同的线程进行处理,但是计算机创建一个线程或者销毁一个线程所花费的也是比较昂贵的,有时候需要同时处理的事情比较多,就需要我们频繁的进行线程的创建和销毁,这样花费的时间也是比较多的。为了解决这一问题,我们就可以引用线程池的概念。

所谓线程池就是将线程集中管理起来,当需要线程的时候,可以从线程池中获取空闲的线程,这样可以减少线程的频繁创建与销毁,节省很大的时间和减少很多不必要的操作。

在java中提供了ThreadPoolExecutor类来进行线程的管理,这个类继承于AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口,我们可以使用ThreadPoolExecutor来进行线程池的创建。

在ThreadPoolExecutor的构造方法中,有多个参数,可以配置不同的参数来进行优化。这个类的源码构造方法为:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)其中每个参数代表的意义分别为

corePoolSize : 线程池中的核心线程数量,当线程池中当前的线程数小于这个配置的时候,如果有一个新的任务到来,即使线程池中还存在空闲状态的线程,程序也会继续创建一个新的线程放进线程池当中

maximumPoolSize: 线程池中的线程最大数量

keepAliveTime:当线程池中的线程数量大于配置的核心线程数量(corePoolSize)的时候,如果当前有空闲的线程,则当这个空闲线程可以存在的时间,如果在keepAliveTime这个时间点内没有新的任务使用这个线程,那么这个线程将会结束,核心线程不会结束,但是如果配置了allowCoreThreadTimeOut = true,则当空闲时间超过keepAliveTime之后,线程也会被结束调,默认allowCoreThreadTimeOut = false,即表示默认情况下,核心线程会一直存在于线程池当中。

unit : 空闲线程保持连接时间(keepAliveTime)的时间单位

workQueue:阻塞的任务队列,用来保存等待需要执行的任务。

threadFactory :线程工厂,可以根据自己的需求去创建线程的对象,设置线程的名称,优先级等属性信息。

handler:当线程池中存在的线程数超过设置的最大值之后,新的任务就会被拒绝,可以自己定义一个拒绝的策略,当新任务被拒绝之后,就会使用hander方法进行处理。

在java中也提供了Executors工具类,在这个工具类中提供了多个创建线程池的静态方法,其中包含newCachedThreadPool、newFixedThreadPool、newScheduledThreadPool、newSingleThreadExecutor等。但是他们每个方法都是创建了ThreadPoolExecutor对象,不同的是,每个对象的初始 参数值不一样;

Java中,线程是什么意思,多线程又是什么

在计算机中当一个程序运行的时候就会创建至少一个进程,例如当我们运行QQ的时候,系统就会创建进程来处理我们平时的一些操作,当我们打开任务管理器的时候,在进程的列表里面就可以找到QQ.exe的运行程序;

在计算机中处理进程之外还有另一个概念就是线程,线程是存在于进程当中,一个进程可以包含多个线程;当我们的计算机有多核处理器的时候,使用多线程可以加快程序的运算速率;如果一个进程中只有一个线程,当程序遇到一个比较耗时的计算的时候,由于程序是单线程的,那么程序只能等待这个运算结束的时候再继续运行,这样会大大的降低程序的效率;当时用多个线程的时候,在某个线程遇到比较耗时的运算的时候,该线程可以继续自己的运算,但是其他的线程也可以同步进行,这样当耗时的计算结束之后,其他线程也将自己所需要的东西执行完毕,这样就会很大的提高程序执行效率;

在程序运行中对于文件的保存相对于处理器的运算速度来说是很慢的,当我们程序中接收到一个保存文件的信息之后,我们可以创建一个保存文件的线程,在主线程中我们可以继续进行我们的其他运算,这样当文件保存好之后,我们的其他运算也会完成,互不影响;

在Java中我们可以创建一个自己的类继承于Thread类,并且重写run() 方法,当线程启动之后,run()方法里面的操作都在线程中进行处理,而不会影响主线程的信息;

当我们创建好一个自定义线程类之后,我们可以创建这个自定义线程的对象,进行线程的启动;线程须调用start();方法进行启动,这样run()方法里面的内容才会在线程中运行;如果我们不去调用start()方法,那我们只是创建了一个普通的类,即使我们手动调用run()方法,run()方法里面的内容也不会在线程中运行;

在Java中线程主要有初始状态,运行状态,阻塞状态,终止状态等;当我们新创建一个线程对象的时候,此时线程的状态为初始状态;当我们调用start()之后,此时的线程才被激活成为运行状态,之后run()方法里面的信息才会在子线程中运行;我们可以在不同的阶段调用不同的方法将线程设置为不同的状态;比如有时候我们的操作需要等待其他线程中运算结束之后才可以继续进行,这时候我们就可以将线程设置为等待状态,当需要的资源满足条件之后,可以继续运行当前的线程;

以上的内容就是关于Java中线程是什么,更多关于Java方面的问题可以看下这个视频教程:网页链接,希望我的回答能帮到你。

java中学习线程应该怎么去学习?

打个比方,用户注册,如果用户注册有如下步骤

1:给用户在数据库中添加用户信息

2:给用户的手机号发送欢迎短信

3:系统中其它模块和用户关联,需要同时添加其它的数据

这个时候,如果使用单线程,用户提交注册信息之后,系统拿到注册信息,就要按照步骤1,2,3这么一步一步走下去,在这过程中,用户只能等待,等到系统把这些步骤走完了,用户才能得到响应,才能登陆系统,这个过程会很长,用户体验不好

但是如果使用多线程,在拿到用户注册信息之后,主进程把这些任务分给多个线程去做,每个线程做一件事,效率是不是提高了,时间是不是缩短了,并且,主线程可以把关键信息录入系统之后就直接响应用户,其它事情可以让线程在后台慢慢执行,这样用户体验就会好很多。

java线程管理类的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java 线程管理、java线程管理类的信息别忘了在本站进行查找喔。