java多线程

工作上用到java多线程的机会很少,在这,我想就java多线程进行深入探讨,线程和进程一样,拥有5个状态,创建,就绪,运行,阻塞,结束。我们平时写代码,有两种方式实现java多线程,一种是继承Thread类,一种是实现Runable接口。
package test;

public class thread1 extends Thread{
   private String name;
   
   public thread1(String name){
	   this.name=name;
   }
   
   public void run(){
	   for(int i=0;i<=4;i++){
		   System.out.println(name+"正在运行!!");
		   try{
			   sleep(100);
		   }catch(Exception e){
			   e.printStackTrace();
		   }
	   }
   }
   
   public static void main(String[] args) {
		// TODO Auto-generated method stub
       Thread th1=new thread1("线程1号");
       Thread th2=new thread1("线程2号");
       th1.start();
       th2.start();
	}
}

在该代码中我只调用了sleep方法,其实还有wait方法,两种的差别在于sleep不让出资源,wait让出资源。

实现Runnable

package test;

public class runable implements Runnable{
    private String name;
    
    public runable(String name){
       this.name=name;
    }
    
	@Override
	public synchronized void run() {
		// TODO Auto-generated method stub
		  for(int i=0;i<=4;i++){
			   System.out.println(name+"正在运行!!");
			   try{
				   wait(300);
			   }catch(Exception e){
				   e.printStackTrace();
			   }
		   }
	}
	
	  public static void main(String[] args) {
			// TODO Auto-generated method stub
	       new Thread(new runable("线程1")).start();
	       new Thread(new runable("线程2")).start();
		}

}
调用Runnable接口比继承Thread类更加适合于共享资源。

看到java多线程受这么多人关注,我决定再补充些内容。

其实,我们开发过的软件,只要有多人使用,就会涉及到多线程,例如,网站前台,多个用户请求相同功能时,这时,每个用户的请求会产生一条消息,每条消息伴随着是一个线程,后台接收到这些消息之后,根据请求的先后进行对方法资源的争夺,这是多线程竞争资源的情形,平时,这些多线程请求资源都是有序的,一个完成再到下一个。如果存在特殊情况,这些线程请求资源已经达到了高并发,我们可以强制性的加上同步锁(synchronized),来进行强制同步。

我举例说明下,怎么用消息队列来管理多线程。

package test;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class test {

	/**
	 * @param args
	 */
	private static List<Queue> queueCache=new LinkedList<Queue>();//定义一个队列缓存池
	private static Integer offerMaxQueue=2000;//定义队列缓存池最大消息数
	private  String queueStr=null;
	public  void test() {
		// TODO Auto-generated method stub
        //定义检出线程
		new Thread(){
			public void run(){
				while(true){
					String ip=null;
					try{
						synchronized (queueCache) {
							Integer size=queueCache.size();
							if(size==0){
								//队列缓冲池没有消息,等待、、、
							}
							Queue queue=queueCache.remove(0);
							if(isLock(queueStr)){
								queueCache.add(queue);//重新加入队列
								continue;
							}else{
								//处理该消息
							}
						}
						
					}catch(Exception e){
						
					}finally{
						try{
							upLock(queueStr);
						//检出该消息队列的锁
						}catch(Exception e){
							
						}
					}
				}
			}
		}.start();
		//定义检入队列
		synchronized (queueCache) {
		   while(true){
			   Integer size=queueCache.size();
			   if(size>=offerMaxQueue){
				   try{
					   queueCache.wait();//不释放资源,进入等待
				   }catch(Exception e){
					   
				   }
			   }
			   if(size<offerMaxQueue&&size>0){
				   queueCache.notifyAll();//唤醒线程
			   }
			   break;
		   }
		}
	}
    
	/**
	 * 实现锁方法
	 * @param queueStr
	 * @return
	 */
	public Boolean isLock(String queueStr){ 
		return null;
	}
	
	/**
	 * 解锁方法
	 */
	public void upLock(String queueStr){
		
	}
}

下面我来说说很容易被我们遗忘的关于java多线程操作的方法。

关于使用 ExecutorService oExecService = Executors  .newFixedThreadPool(num);  来使用多线程点击打开链接

.wait(),.notify(),.notifyAll();都是关于使用多线程要用到的。点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值