「java线程案例」Java线程案例

博主:adminadmin 2023-01-04 13:06:09 669

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

本文目录一览:

一个简单java多线程的示例

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

System.out.println(name+"运行,i="+i);

Thread.sleep(1)

}

for循环这样改就行了,因为输出10个数比较小,当你启动启动第二个线程时第一个线程已经运行完毕,所以两次输出都是顺序输出,要么将i设置很大很大,要么让每次打印暂停一下

Java中关于如何实现多线程消息队列的实例

java中的消息队列

消息队列是线程间通讯的手段:

import java.util.*

public class MsgQueue{

private Vector queue = null;

public MsgQueue(){

queue = new Vector();

}

public synchronized void send(Object o)

{

queue.addElement(o);

}

public synchronized Object recv()

{

if(queue.size()==0)

return null;

Object o = queue.firstElement();

queue.removeElementAt(0);//or queue[0] = null can also work

return o;

}

}

因为java中是locked by object的所以添加synchronized 就可以用于线程同步锁定对象

可以作为多线程处理多任务的存放task的队列。他的client包括封装好的task类以及thread类

Java的多线程-线程间的通信2009-08-25 21:58

1. 线程的几种状态

线程有四种状态,任何一个线程肯定处于这四种状态中的一种:

1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。

2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。

3) 死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。

4) 停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。

2. class Thread下的常用函数函数

2.1 suspend()、resume()

1) 通过suspend()函数,可使线程进入停滞状态。通过suspend()使线程进入停滞状态后,除非收到resume()消息,否则该线程不会变回可执行状态。

2) 当调用suspend()函数后,线程不会释放它的“锁标志”。

例11:

class TestThreadMethod extends Thread{

public static int shareVar = 0;

public TestThreadMethod(String name){

super(name);

}

public synchronized void run(){

if(shareVar==0){

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

shareVar++;

if(shareVar==5){

this.suspend(); //(1)

}}}

else{

System.out.print(Thread.currentThread().getName());

System.out.println(" shareVar = " + shareVar);

this.resume(); //(2)

}}

}

public class TestThread{

public static void main(String[] args){

TestThreadMethod t1 = new TestThreadMethod("t1");

TestThreadMethod t2 = new TestThreadMethod("t2");

t1.start(); //(5)

//t1.start(); //(3)

t2.start(); //(4)

}}

java中 举个线程阻塞的例子

java中线程有4种状态:

runnable,

blocked,

waiting,

timed_waiting

当一个线程运行至

inputstream.read()发生阻塞时,线程处于runnable。

Java线程;生产消费者例子

小小回顾 写了个简单的demo 项目中没有过 还能记得 纪念一下

产品的entity

Java代码

public class Product {

//产品名称

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this name = name;

}

}

生产者

Java代码

/**

* 生产者

* @author 饭香

*

*/

public class Producer implements Runnable{

private Shop shop;//要去送货的商店

public Producer(Shop shop){

this shop=shop;

}

public void run() {

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

shop produ();

}

}

}

消费者

Java代码

/**

* 消费者

* @author 饭香

*

*/

public class Cousumer implements Runnable{

private Shop shop;//要去消费的商店

public Cousumer(Shop shop){

this shop=shop;

}

public void run() {

for(int i= ;i ;i++){//消费 次

usu();

}

}

}

模拟商店(一切围绕商店 商店只能有一个 产品随便多个实例 这个也是别人问我总是出错的地方 对象思想)

Java代码

import java util ArrayList;

import java util List;

/**

* 模拟商店 (进货/销售)

* @author fx

*

*/

public class Shop {

private static int i= ;

//产品的容器;达到容器暂停生产 消费到 等待生产

private static ListProduct list;

static{

list= new ArrayListProduct();

}

/**

* 生产产品

*/

public synchronized void produ(){

if(list size()= ){

try {

System out println( 生产商品 +i+ 时 达到了总数暂停生产 );

this wait();//进入休眠

} catch (InterruptedException e) {

System out println(e toString());

e=null;

}

} //生产商品

Product product= new Product();

product setName( 商品 +i);

list add(product);

System out println( 生产了商品 +product getName()+ 商品总数 +i);

System out println( 容器容量 +list size());

i++;

super notify();

}

/**

* 消费产品

* @return

*/

public synchronized void cousu(){

if(list size()== ){//消费完时 挂起

System out println( +++++++++++++++++++++++商品消费完了 等待+++++++++++++++= );

try {

this wait();

} catch (InterruptedException e) {

// TODO Auto generated catch block

System out println(e toString());

e=null;

}

}

Product product=list get( );

list remove( );

System out println( 消费了获得了商品 +product getName());

System out println( 容器容量 +list size());

super notify();

}

}

测试代码

Java代码

public static void main(String[] args) {

Shop shop=new Shop();//商店

Producer pro=new Producer(shop);

Cousumer cou = new Cousumer(shop);

new Thread(pro pro ) start();

new Thread(cou cou ) start();

}

生产了商品 商品 商品总数

容器容量

消费了获得了商品 商品

容器容量

+++++++++++++++++++++++商品消费完了 等待+++++++++++++++=

生产了商品 商品 商品总数

容器容量

消费了获得了商品 商品

容器容量

+++++++++++++++++++++++商品消费完了 等待+++++++++++++++=

生产了商品 商品 商品总数

容器容量

消费了获得了商品 商品

容器容量

+++++++++++++++++++++++商品消费完了 等待+++++++++++++++=

生产了商品 商品 商品总数

容器容量

生产了商品 商品 商品总数

容器容量

消费了获得了商品 商品

容器容量

生产了商品 商品 商品总数

容器容量

消费了获得了商品 商品

容器容量

生产了商品 商品 商品总数

容器容量

消费了获得了商品 商品

容器容量

消费了获得了商品 商品

lishixinzhi/Article/program/Java/gj/201311/27600

java常用的几种线程池实例讲解

下面给你介绍4种线程池:

1、newCachedThreadPool:

底层:返回ThreadPoolExecutor实例,corePoolSize为0;maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为60L;unit为TimeUnit.SECONDS;workQueue为SynchronousQueue(同步队列)

通俗:当有新任务到来,则插入到SynchronousQueue中,由于SynchronousQueue是同步队列,因此会在池中寻找可用线程来执行,若有可以线程则执行,若没有可用线程则创建一个线程来执行该任务;若池中线程空闲时间超过指定大小,则该线程会被销毁。

适用:执行很多短期异步的小程序或者负载较轻的服务器

2、newFixedThreadPool:

底层:返回ThreadPoolExecutor实例,接收参数为所设定线程数量nThread,corePoolSize为nThread,maximumPoolSize为nThread;keepAliveTime为0L(不限时);unit为:TimeUnit.MILLISECONDS;WorkQueue为:new LinkedBlockingQueueRunnable() 无解阻塞队列

通俗:创建可容纳固定数量线程的池子,每隔线程的存活时间是无限的,当池子满了就不在添加线程了;如果池中的所有线程均在繁忙状态,对于新任务会进入阻塞队列中(无界的阻塞队列)

适用:执行长期的任务,性能好很多

3、newSingleThreadExecutor

底层:FinalizableDelegatedExecutorService包装的ThreadPoolExecutor实例,corePoolSize为1;maximumPoolSize为1;keepAliveTime为0L;unit为:TimeUnit.MILLISECONDS;workQueue为:new LinkedBlockingQueueRunnable() 无解阻塞队列

通俗:创建只有一个线程的线程池,且线程的存活时间是无限的;当该线程正繁忙时,对于新任务会进入阻塞队列中(无界的阻塞队列)

适用:一个任务一个任务执行的场景

4、NewScheduledThreadPool:

底层:创建ScheduledThreadPoolExecutor实例,corePoolSize为传递来的参数,maximumPoolSize为Integer.MAX_VALUE;keepAliveTime为0;unit为:TimeUnit.NANOSECONDS;workQueue为:new DelayedWorkQueue() 一个按超时时间升序排序的队列

通俗:创建一个固定大小的线程池,线程池内线程存活时间无限制,线程池可以支持定时及周期性任务执行,如果所有线程均处于繁忙状态,对于新任务会进入DelayedWorkQueue队列中,这是一种按照超时时间排序的队列结构

适用:周期性执行任务的场景

最后给你说一下线程池任务执行流程:

当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行

当workQueue已满,且maximumPoolSizecorePoolSize时,新提交任务会创建新线程执行任务

当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理

当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程

当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

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