导航:首页 > 编程语言 > javatask多线程

javatask多线程

发布时间:2025-03-27 03:23:44

A. 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)来完成了

packagemine.util.thread;

importjava.util.LinkedList;
importjava.util.List;

/**
*线程池类,线程管理器:创建线程,执行任务,销毁线程,获取线程基本信息
*/
publicfinalclassThreadPool{
//线程池中默认线程的个数为5
privatestaticintworker_num=5;
//工作线程
privateWorkThread[]workThrads;
//未处理的任务
_task=0;
//任务队列,作为一个缓冲,List线程不安全
privateList<Runnable>taskQueue=newLinkedList<Runnable>();
;

//创建具有默认线程个数的线程池
privateThreadPool(){
this(5);
}

//创建线程池,worker_num为线程池中工作线程的个数
privateThreadPool(intworker_num){
ThreadPool.worker_num=worker_num;
workThrads=newWorkThread[worker_num];
for(inti=0;i<worker_num;i++){
workThrads[i]=newWorkThread();
workThrads[i].start();//开启线程池中的线程
}
}

//单态模式,获得一个默认线程个数的线程池
(){
returngetThreadPool(ThreadPool.worker_num);
}

//单态模式,获得一个指定线程个数的线程池,worker_num(>0)为线程池中工作线程的个数
//worker_num<=0创建默认的工作线程个数
(intworker_num1){
if(worker_num1<=0)
worker_num1=ThreadPool.worker_num;
if(threadPool==null)
threadPool=newThreadPool(worker_num1);
returnthreadPool;
}

//执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定
publicvoidexecute(Runnabletask){
synchronized(taskQueue){
taskQueue.add(task);
taskQueue.notify();
}
}

//批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定
publicvoidexecute(Runnable[]task){
synchronized(taskQueue){
for(Runnablet:task)
taskQueue.add(t);
taskQueue.notify();
}
}

//批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定
publicvoidexecute(List<Runnable>task){
synchronized(taskQueue){
for(Runnablet:task)
taskQueue.add(t);
taskQueue.notify();
}
}

//销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁
publicvoiddestroy(){
while(!taskQueue.isEmpty()){//如果还有任务没执行完成,就先睡会吧
try{
Thread.sleep(10);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
//工作线程停止工作,且置为null
for(inti=0;i<worker_num;i++){
workThrads[i].stopWorker();
workThrads[i]=null;
}
threadPool=null;
taskQueue.clear();//清空任务队列
}

//返回工作线程的个数
publicintgetWorkThreadNumber(){
returnworker_num;
}

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

//返回任务队列的长度,即还没处理的任务个数
publicintgetWaitTasknumber(){
returntaskQueue.size();
}

//覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数
@Override
publicStringtoString(){
return"WorkThreadnumber:"+worker_num+"finishedtasknumber:"
+finished_task+"waittasknumber:"+getWaitTasknumber();
}

/**
*内部类,工作线程
*/
{
//该工作线程是否有效,用于结束该工作线程
privatebooleanisRunning=true;

/*
*关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待
*/
@Override
publicvoidrun(){
Runnabler=null;
while(isRunning){//注意,若线程无效则自然结束run方法,该线程就没用了
synchronized(taskQueue){
while(isRunning&&taskQueue.isEmpty()){//队列为空
try{
taskQueue.wait(20);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
if(!taskQueue.isEmpty())
r=taskQueue.remove(0);//取出任务
}
if(r!=null){
r.run();//执行任务
}
finished_task++;
r=null;
}
}

//停止工作,让该线程自然执行完run方法,自然结束
publicvoidstopWorker(){
isRunning=false;
}
}
}

B. java多线程实现 5秒一次打印当前时间

package com.test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class PrnCurrentTime implements Runnable {
public void run()
{
while(true){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Date now = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(df.format(now));
}
}

/**
* @ args
*/
public static void main(String[] args) {
PrnCurrentTime p = new PrnCurrentTime();
new Thread(p).start();
}

}

C. java多线程框架有哪些

Java多线程框架主要有以下几种:


1. Java原生线程框架


Java语言本身提供了多线程的原生支持,通过java.lang.Thread类以及java.util.concurrent包中的一系列类来实现多线程编程。其中,Thread类是Java中最基本的线程类,可以通过继承Thread类或使用实现Runnable接口的方式创建线程。此外,java.util.concurrent包提供了一系列支持并发编程的工具类,如ExecutorService、CountDownLatch等。


2. Spring框架中的多线程支持


Spring框架提供了对多线程编程的良好支持,主要体现在Spring的任务调度框架中。通过Spring的TaskExecutor接口,可以方便地进行任务调度和线程池管理。此外,Spring还提供了注解驱动的异步方法执行,通过@Async注解可以轻松地实现异步处理。


3. Java并发包java.util.concurrent


java.util.concurrent包是Java标准库中一个重要的并发工具包,提供了多种并发编程的工具类。其中,线程池相关的类如ThreadPoolExecutor、ScheledThreadPoolExecutor等被广泛应用于多线程编程中。此外,该包还提供了并发集合类,可以有效地处理并发访问问题。


4. Java多线程框架Apache MINA和Netty


Apache MINA和Netty是Java中常用的网络编程框架,它们也提供了对多线程编程的支持。这两个框架都基于异步事件驱动模型,可以有效地处理高并发网络连接和数据传输。其中,Netty是一个高性能的异步事件驱动的网络应用框架,广泛应用于开发网络服务和分布式系统


以上这些Java多线程框架各有特点,适用于不同的应用场景。开发者可以根据具体需求选择合适的框架来实现多线程编程。

D. 什么是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而在处理请求时浪费时间,从而提高效率。

E. 浅谈Java多线程的同步问题

多线程的同步依靠的是对象锁机制 synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问

下面以一个简单的实例来进行对比分析 实例要完成的工作非常简单 就是创建 个线程 每个线程都打印从 到 这 个数字 我们希望线程之间不会出现交叉乱序打印 而是顺序地打印

先来看第一段代码 这里我们在run()方法中加入了synchronized关键字 希望能对run方法进行互斥访问 但结果并不如我们希望那样 这是因为这里synchronized锁住的是this对象 即当前运行线程对象本身 代码中创建了 个线程 而每个线程都持有this对象的对象锁 这不能实现线程的同步

代码 package vista; class MyThread implements java lang Runnable { private int threadId;

public MyThread(int id) { this threadId = id; }

@Override public synchronized void run() { for (int i = ; i < ; ++i) { System out println( Thread ID: + this threadId + : + i); } } }

public class ThreadDemo { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { for (int i = ; i < ; ++i) { new Thread(new MyThread(i)) start(); Thread sleep( ); } } }

从上述代码段可以得知 要想实现线程的同步 则这些线程必须去竞争一个唯一的共享的对象锁

基于这种思想 我们将第一段代码修改如下所示 在创建启动线程之前 先创建一个线程之间竞争使用的Object对象 然后将这个Object对象的引用传递给每一个线程对象的lock成员变量 这样一来 每个线程的lock成员都指向同一个Object对象 我们在run方法中 对lock对象使用synchronzied块进行局部封锁 这样就可以让线程去竞争这个唯一的共享的对象锁 从而实现同步

代码 package vista;

class MyThread implements java lang Runnable { private int threadId; private Object lock;

public MyThread(int id Object obj) { this threadId = id; this lock = obj; }

@Override public void run() { synchronized (lock) { for (int i = ; i < ; ++i) { System out println( Thread ID: + this threadId + : + i); } } } }

public class ThreadDemo { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { Object obj = new Object(); for (int i = ; i < ; ++i) { new Thread(new MyThread(i obj)) start(); Thread sleep( ); } } }

从第二段代码可知 同步的关键是多个线程对象竞争同一个共享资源即可 上面的代码中是通过外部创建共享资源 然后传递到线程中来实现 我们也可以利用类成员变量被所有类的实例所共享这一特性 因此可以将lock用静态成员对象来实现 代码如下所示

代码 package vista;

class MyThread implements java lang Runnable { private int threadId; private static Object lock = new Object();

public MyThread(int id) { this threadId = id; }

@Override public void run() { synchronized (lock) { for (int i = ; i < ; ++i) { System out println( Thread ID: + this threadId + : + i); } } } }

public class ThreadDemo { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { for (int i = ; i < ; ++i) { new Thread(new MyThread(i)) start(); Thread sleep( ); } } }

再来看第一段代码 实例方法中加入sychronized关键字封锁的是this对象本身 而在静态方法中加入sychronized关键字封锁的就是类本身 静态方法是所有类实例对象所共享的 因此线程对象在访问此静态方法时是互斥访问的 从而可以实现线程的同步 代码如下所示

代码 package vista;

class MyThread implements java lang Runnable { private int threadId;

public MyThread(int id) { this threadId = id; }

@Override public void run() { taskHandler(this threadId); }

private static synchronized void taskHandler(int threadId) { for (int i = ; i < ; ++i) { System out println( Thread ID: + threadId + : + i); } } }

lishixin/Article/program/Java/gj/201311/27441

阅读全文

与javatask多线程相关的资料

热点内容
word宏添加空格 浏览:161
芯片的spi编程如何抗干扰 浏览:885
html5打开本地文件 浏览:457
dotm文件 浏览:798
powermill机床文件mtd如何建立 浏览:364
灰灰网站源码 浏览:639
笔记本为什么没有tim文件 浏览:613
中兴手机录音文件夹 浏览:278
经期app软件哪个好 浏览:697
旅游出行的app有什么特点 浏览:596
qq的小视频在哪个文件夹 浏览:528
win10电脑桌面成开始了 浏览:391
手机下照片转u盘文件丢失 浏览:991
plc编程怎么设置延时断电 浏览:553
安卓modemdump文件在哪个路径 浏览:914
vb画直线与圆相切程序 浏览:988
win10电话激活远景 浏览:995
网络传真如何安装 浏览:765
网络电视看成人频道 浏览:148
plc编程软件怎么选择 浏览:247

友情链接