`
chaijuntao
  • 浏览: 23105 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 多线程-基础(Thread篇)

阅读更多
什么是多线程?

         在进入正题前,我们还是先来问两个问题,什么叫“多线程”? 以及“Java多线程”跟“多线程”有什么联系?

          好吧,问题看似简单但也抽象,想要搞清楚答案,我们还是回到现实生活中找找答案吧。

          现在两小夫妻就驰骋在一条单向四车道的草原高速公路上,去60公里外的A城办结婚证,车很多但至少能保持120码全速行驶,贼爽了!不到半个小时就快下高速了~~~但是,“我了个去!咋收费口就一个?”,高速上没其他出口,排队吧。。。

           经过了一个小时的挪动,他俩终于过了收费口,马不停蹄地赶去行政中心,满心欢喜地等着领取这本的“合法持枪证”,“今天真是个好日子!满大厅的人等着领证呢!我了个去!咋办证口就一个?”,不领证不行,排队吧。。。

           好了,这时候如果让你来缓解上面两个拥堵状况,你的方案是什么?很显然,你会想到多开几个窗口同时服务呗!如果把进程比作高速公路收费站和民政局大厅,那么每一个收费口和领证窗口就是一个线程,当同时有多个线程一起工作时,就是我们所说的“多线程”啦!

           那“Java多线程”呢?嘿嘿,就不卖关子了,就是用Java语言实现的“多线程”!哈哈,淡定,其实这是有意义的,因为不是所有语言都支持“多线程”,Java是少数几种支持“多线程”的语言之一,记住了!

Java多线程的实现

            其实不仅日常生活中,在很多应用程序中多线程也非常普及了,比如Eclipse-支持多窗口切换编辑,浏览器-支持多标签访问,迅雷-多线程下载等等。如果以上应用都是单线程的,那势必没人会用他们的产品。

             ok,接下来我们来看看Java的多线程到底长啥样。

             注:Java多线程的一种实现方式是集成Thread类,那难道还有其他实现方式?当然,但后面再讲,我们先来了解Thread类

public class ThreadDemoOne extends Thread {
	
	int no,workno,sleeptime;
	public ThreadDemoOne(int no,int workno,int sleeptime) {
		// TODO Auto-generated constructor stub
		this.no = no;
		this.workno = workno;
		this.sleeptime = sleeptime;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Thread.sleep(sleeptime);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Thread["+no+"] do work "+workno);
	}
	
	public static void main(String[] args) {
		System.out.println("Main do work 1");
		new ThreadDemoOne(1,2,3000).run();
		System.out.println("Main do work 3");
		System.out.println("Main do work 4");
		new ThreadDemoOne(2,5,1000).run();
		
	}
}

 

       运行起来,看看结果,走你~             

       Main do work 1
       Thread[1] do work 2
       Main do work 3
       Main do work 4
       Thread[2] do work 5

       结果跑出来了!别急,这乍看效果不错,仔细看,这依旧是顺序执行任务嘛,跟一个收费口的效果是一样的,并没有达到所谓的多个任务同时运行啊。认真看过书的同学应该已经发现,问题就出在run()方法上,run()是实现多线程必须覆写的方法,但激活多线程的方法是start()。好吧,知道原因了,我们就来改代码吧:

public class ThreadDemoOne extends Thread {
	
	int no,workno,sleeptime;
	public ThreadDemoOne(int no,int workno,int sleeptime) {
		// TODO Auto-generated constructor stub
		this.no = no;
		this.workno = workno;
		this.sleeptime = sleeptime;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			Thread.sleep(sleeptime);//休息“sleeptime”时间
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("Thread["+no+"] do work "+workno);
	}
	
	public static void main(String[] args) {
		System.out.println("Main do work 1");
		new ThreadDemoOne(1,2,3000).start();
		System.out.println("Main do work 3");
		System.out.println("Main do work 4");
		new ThreadDemoOne(2,5,1000).start();
		
	}
}

        再运行一次:

        Main do work 1
        Main do work 3
        Main do work 4
        Thread[2] do work 5
        Thread[1] do work 2

        

         有同学要问,为什么work2先调用,结果比work5晚输出?那这个请看官仔细看Thread.sleep这个方法,就不赘述了。

          OK,从结果我们发现,Main顺序地执行自己的1,3,4号任务,把2号任务丢给了线程1,把5号任务丢个了线程2,这样就达到了三个线程一起做事情的效果。又有同学要问了,我只看到Main把任务丢给了Thread做,但并没看到他们一起做啊。

           OK,请看下面:

public class ThreadDemoOne extends Thread {
	
	int no,workno,sleeptime;
	public ThreadDemoOne(int no,int workno,int sleeptime) {
		// TODO Auto-generated constructor stub
		this.no = no;
		this.workno = workno;
		this.sleeptime = sleeptime;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			for(int i=0;i<5;i++){
				System.out.println("Thread["+no+"] do work "+workno+"_"+i);
				Thread.sleep(1000);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args) throws InterruptedException {
		System.out.println("Main do work 1");
		new ThreadDemoOne(1,2,1000).start();
		System.out.println("Main do work 3");
		Thread.sleep(1000);
		System.out.println("Main do work 4");
		new ThreadDemoOne(2,5,1000).start();
		Thread.sleep(1000);
		System.out.println("Main do work 6");
	}
}

Main do work 1
Main do work 3
Thread[1] do work 2_0
Thread[1] do work 2_1
Main do work 4
Thread[2] do work 5_0
Main do work 6
Thread[2] do work 5_1
Thread[1] do work 2_2
Thread[2] do work 5_2
Thread[1] do work 2_3
Thread[2] do work 5_3
Thread[1] do work 2_4
Thread[2] do work 5_4

事实胜于雄辩,请看官参详~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics