`
gaosililn
  • 浏览: 70192 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

java 多线程

    博客分类:
  • Java
阅读更多

在Java中,创建线程有两种方式,其中一种是继承Thread ,另外一种是实现Runnable接口。

这两种方法各有优点,继承的那种方便一点,但是在已继承其他类的情况下是有点儿麻烦的,这时要使用内部类来实现。但是在实现Runnable接口的却不存在这种情况,接口可以同时衔接多个接口。在实现Runnable接口是,可以创建多个线程对同一个数据库进行操作,比如售票系统,这个在内部类继承Thread也是可以实现的。

 

 

进程与线程是两个不同的概念。一个进程中可以有多个进程。比如说我们执行执行一个程序,这是一个进程,在这个程序中可能异已经启动多个线程了。

/**
 * 简单测试线程
 * 继承thread来创建线程
 * @author gaosi
 *
 */
public class Test extends Thread{
	String name;
	public Test(String name){
		this.name=name;
	}
	public void run(){
		for(int i=0;i<5;i++)
		{
			System.out.println(name+"执行"+i+"次");
		}
	}
	public static void main(String[] args) {
		Test ta=new Test("A");
		Test tb=new Test("B");
		ta.run();
		tb.run();
	}
}

 

输出结果:

A执行0次
A执行1次
A执行2次
A执行3次
A执行4次
B执行0次
B执行1次
B执行2次
B执行3次
B执行4次

这是单线程即main线程执行的结果,(这是我们并没有启动多线程,线程启动用star())。

我们启动一下多线程来试一下刚才的输出是否会一样?

	public static void main(String[] args) {
		Test ta=new Test("A");
		Test tb=new Test("B");
		ta.start();
		tb.start();
	}
}

 

输出结果:

A执行0次
B执行0次
A执行1次
B执行1次
A执行2次
B执行2次
A执行3次
B执行3次
A执行4次
B执行4次

也有可能是

B执行0次
A执行0次
A执行1次
A执行2次
B执行1次
A执行3次
B执行2次
A执行4次
B执行3次
B执行4次

等。总之输出结果不唯一。

我的个人理解是:可能是系统的问题,系统给予每个线程的时间是随机的轮换,也即是说这得看系统心情看哪个线程顺眼一点……

上面提到继承Thread不可以实现资源共享,(在内部类继承Thread是可以的),实现Runnable接口到时轻松实现资源共分享,如售票系统。

下面用简单的代码演示一下:

public class Test extends Thread{
	int ticket =10;
	String name;
	public Test(String name){
		this.name=name;
	}
	public void run(){
		for(int i=0;i<5;i++)
		{
			System.out.println(name+"剩余的票数"+ticket);
			ticket--;
		}
	}
	public static void main(String[] args) {
		Test ta=new Test("A");
		Test tb=new Test("B");
		ta.start();
		tb.start();
	}
}

 

输出结果:

A剩余的票数10
B剩余的票数10
B剩余的票数9
B剩余的票数8
B剩余的票数7
B剩余的票数6
A剩余的票数9
A剩余的票数8
A剩余的票数7
 A剩余的票数6

输出结果不唯一,但是输出剩余的票数是唯一的。原因上面所讲。

对比一下实现Runnable接口的:

 

class Test implements Runnable{
	int ticket=10;//定义票数为10
	public Test(){}
	public void run(){
		for(;ticket>0;){
			System.out.println(Thread.currentThread().getName()+"在售票!剩余票数"+ticket--);
			
			
		}
	}
	public static void main(String[] args) {
		Test t1=new Test();
		/**
		 * 启动多个线程,对同一个数据库进行操作
		 */
		new Thread(t1,"A").start();
		new Thread(t1,"B").start();
		new Thread(t1,"C").start();
	}
}

 

 输出结果:

B在售票!剩余票数8
B在售票!剩余票数7
C在售票!剩余票数9
A在售票!剩余票数10
C在售票!剩余票数5
B在售票!剩余票数6
C在售票!剩余票数3
A在售票!剩余票数4
C在售票!剩余票数1
B在售票!剩余票数2

或者:

A在售票!剩余票数10
A在售票!剩余票数8
A在售票!剩余票数7
A在售票!剩余票数5
A在售票!剩余票数4
A在售票!剩余票数3
A在售票!剩余票数2
A在售票!剩余票数1
B在售票!剩余票数9
C在售票!剩余票数6

//看数据。输出结果不唯一

如果票数不是定义为全局变量,结果会不同的

/////////////////////////

辨别一下两种写法的区别

/**
 * 继承thread,用内部类来实现数据共享
 */
public class Test extends Thread{
	int ticket=10;//定义票数,全局
	public void run(){
		for(;ticket!=0;){
			System.out.println(Thread.currentThread().getName()+"正在售票"+ticket--);
		}
	}
	
	
	public static void main(String[] args) {
		Test t=new Test();
		/**
		 * 创建线程,并且启动多线程
		 */
		new Thread(t,"A").start();
		new Thread(t,"B").start();
		new Thread(t,"c").start();
		
	}
}

 

其中一种输出结果:

A正在售票10
A正在售票7
A正在售票6
A正在售票5
A正在售票4
A正在售票3
A正在售票2
A正在售票1
B正在售票8
c正在售票9

public class Test extends Thread{
	int ticket=10;//定义票数,全局
	public void run(){
		for(;ticket!=0;){
			System.out.println(Thread.currentThread().getName()+"正在售票"+ticket--);
		}
	}
	
	
	public static void main(String[] args) {
		/**
		 * 创建线程,并且启动多线程
		 */
		Test t1=new Test();
		Test t2=new Test();
		Test t3=new Test();
		t1.start();
		t2.start();
		t3.start();
		/*new Thread(t,"A").start();
		new Thread(t,"B").start();
		new Thread(t,"c").start();*/
		
	}
}

 

其中一种结果为:

Thread-0正在售票10
Thread-0正在售票9
Thread-0正在售票8
Thread-0正在售票7
Thread-1正在售票10
Thread-1正在售票9
Thread-1正在售票8
Thread-1正在售票7
Thread-1正在售票6
Thread-0正在售票6
Thread-1正在售票5
Thread-1正在售票4
Thread-1正在售票3
Thread-1正在售票2
Thread-1正在售票1
Thread-2正在售票10
Thread-2正在售票9
Thread-2正在售票8
Thread-2正在售票7
Thread-0正在售票5
Thread-0正在售票4
Thread-0正在售票3
Thread-0正在售票2
Thread-0正在售票1
Thread-2正在售票6
Thread-2正在售票5
Thread-2正在售票4
Thread-2正在售票3
Thread-2正在售票2
Thread-2正在售票1
《完》

个人觉得实现Runnable接口更好一点……

 

3
2
分享到:
评论
2 楼 肆无忌惮_ 2014-11-27  
贴错代码了
1 楼 glory521521 2014-11-27  
LZ最后两种对比的时候,是不是写错了???最后两种对比,你没有去实现Runnable接口,最后两种都是继承的Thread

相关推荐

    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