`
yaolinnan
  • 浏览: 56857 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

java多线程

 
阅读更多

1、多线程概述

线程不是进程,它们都是并发机制的一种有效手段,进程包括线程,线程是比进程更小的执行单位,可以简单的将线程理解为任务。多线程就是指一个进程可以产生很多个更小的程序单元,它们可以同时存在,同时运行。

2、线程的实现

java实现线程主要是两种方式,一种是继承Thread类,另一种是实现Runnable接口。

public class Test {

	public static void main(String[] args) {
		Loop l=new Loop();
		Thread t=new Thread(l);
		t.start();//启动线程
	}

}
//实现Runnable接口方式
class Loop implements Runnable{

	@Override
	public void run() {
		for(int i=0;i<10;i++){
			System.out.println("Loop:"+i+" "+new Date());
			
		}
	}
}

 

public class Test1 {
	public static void main(String[] args) {
		my t=new my("thread");//线程名称
		t.start();//启动线程
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		t.shut();//线程停止
		System.out.println(Thread.currentThread().getName()+" is alive!");
	}
}
//继承Thread类
class my extends Thread{
	private boolean tag=true;
	my(String s){
		super(s);
	}
	public void run(){
		while(Thread.currentThread().isAlive()&&tag){
			try {
				System.out.println(Thread.currentThread().getName()+" is start! "+new Date());
				sleep(1000);
			} catch (InterruptedException e) {
				System.out.println(Thread.currentThread().getName()+" is interrupted!");
				e.printStackTrace();
				return;
			}
			
		}
	}
	public void shut(){
		System.out.println(this.getName()+" is dead!");
		tag=false;
	}
}

 

3、线程的状态

其实,java的main方法也是一个线程,而要想实现多线程,则必须在主线程中创建新的线程对象。任何线程一般具有5中状态,即创建、就绪、运行、阻塞、终止。

1)新建状态(New):新创建了一个线程对象。

2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3)运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

4、java中对线程的主要方法

1)设置和取得线程名称:Thread类的setName()和getName();

2)判断线程是否启动:isAlive()方法判断线程是否在活动

3)中断线程:首先通过isInterrupted()方法判断线程是否被中断,然后调用interrupt()方法中断线程

4)线程休眠:Thread类的sleep方法,并设置休眠的时间,单位是毫秒

5)线程优先级:多线程中,哪个线程的优先级高,哪个就先被执行,通过setPriority()方法来设置优先级,其中Thread类中有三个优先级常量(详见API文档)

6)线程礼让:yield方法是将一个线程的操作暂时让给其他线程执行

 

5、线程安全

在多线程中,线程之间很可能会共享某个类的属性,这样 就有可能出现同步和死锁的问题,这里不详细描述,这个时候我们可以通过synchronized关键字来将一个方法声明为同步方法。

下面这个例子就是解决线程操作中一个经典的案例--生产者和消费者,生产者不断生产产品,而消费者不断消费。

//商品类
class Production{
	private String name;//名称
	
	private int id;
	
	private int num;//数量
	
	public synchronized void add(int id,String name){
		if(num!=0){//当数量大于0,则商品有剩余,需要被消费掉,故生产线程等待
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.id=id;
		this.name=name;
		num++;
		System.out.println("生产一个产品:name="+name+",id="+id);
		this.notifyAll();
	}
	
	public synchronized void delete(){
		if(num==0){//当数量等于0,则商品没有剩余,需要生产,故消费线程等待
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		num--;
		System.out.println("消费一个产品:name="+this.name+",id="+this.id);
		this.notifyAll();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	
}

//生产线程
class Producer implements Runnable{
	
	private Production product;
	
	public Producer(Production p){
		this.product=p;
	}

	@Override
	public void run() {
		boolean flag=false;
		for(int i=0;i<5;i++){
				if(flag){
					this.product.add(i, "hello");
					flag=false;
				}
				else{
					this.product.add(i, "test");
					flag=true;
				}
		}
	}
	
}

//消费线程
class Consumer implements Runnable{
	
	private Production product;
	
	public Consumer(Production p){
		product=p;
	}

	@Override
	public void run() {
		for(int i=0;i<5;i++){
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			this.product.delete();
		}
	}
	
}

public class ProducerAndConsumer {

	public static void main(String[] args) {
		Production p=new Production();
		//共享同一个商品类
		Producer producer=new Producer(p);
		Consumer consumer=new Consumer(p);
		//启动线程
		new Thread(producer).start();
		new Thread(consumer).start();
	}
}

 

 

精彩科技工作室
  • 大小: 26.3 KB
分享到:
评论

相关推荐

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java 多线程操作数据库

    一个java 多线程操作数据库应用程序!!!

    java多线程经典案例

    java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例

    Java多线程编程技术

    《Java多线程编程核心技术》建议猿友们读两遍,因为其写得没有那么抽象,第一遍有些概念不是很理解,可以先跳过并记录起来,第一遍阅读的目的主要是了解整个架构。第二遍再慢慢品味,并贯穿全部是指点来思考,并将...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    Java多线程知识点总结

    该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!

    java多线程的讲解和实战

    详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。

    java多线程通信图解

    一张图方便理解和掌握java 多线程之间通信的实质 java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,...

    java多线程处理数据库数据

    java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。

    java多线程,对多线程,线程池进行封装,方便使用

    java多线程,对多线程,线程池进行封装,方便使用

    Java多线程编程经验

    现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 线程是指进程中的一个执行流程,一个进程中可以运行多个线程。...本文档提供Java多线程编程经验,方便广大Java爱好者研究学习Java多线程

    java多线程处理大数据

    java多线程处理大数据,可根据配置的线程数,任务去调度处理

    java多线程并发

    java多线程并发的在新窗口

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...

    java多线程核心技术

    资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...

    java多线程实现大批量数据导入源码

    java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制

    java多线程查询数据库

    java多线程并发查询数据库,使用线程池控制分页,并发查询。

    java多线程模拟队列实现排队叫号

    java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号 java多线程模拟队列实现排队叫号,多线程模拟排队叫号取号

Global site tag (gtag.js) - Google Analytics