多线程(多线程原理)

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------java

 

多线程见名知意就是多个线程,学习多线程直线咱们先看个图解大概了解一下多线程的生命周期,方便学习:多线程

用生活中的例子来讲多线程就是:好比咱们平时坐的公交车和地铁咱们的出发和目的地都是同样的.不过咱们便可经过乘坐公交车的形式,也能够经过乘坐地铁的形式来到达目的地.虽然咱们的出发地和目的地是同样的可是咱们能够经过不一样的方式实现,以免拥堵,这样就避免了道路上的阻塞,若是没有地铁只有公交车虽有人都去挤公交车那么就会显的很是的拥堵,这样映射到咱们的多线程相信你们应该提现到多线程的好处.实现了每条线程的高效.ide

咱们既然说到线程就要和进程来区分一下,那么他们之间到底有什么联系呢?函数

其实线程就是进程经过的途径,那么进程呢?工具

咱们在启动电脑的任务管理器的时候工具栏都有一个进程的选项,点开这个进程咱们就能看到电脑上正在进行的程序.这个就是咱们所说的进程,也就是进行的程序.学习

 

 

在上图中咱们还看到了线程的阻塞,就比如是马路上的红绿灯同样.红灯的时候咱们须要等待,其实就是休眠就是图上锁说的sleep和wait方法.绿灯的时候又抢到了CPU的执行选,因此线程继续开始.this

既然咱们说到了sleep和wait那么他们之间又有什么关系呢?spa

咱们主要是经过他们的区别来介绍.线程

主要分为4个方面:位置,类,参数,是否释放锁code

位置:sleep能够加在任意的位置而wait只能用在同步代码跨的前面

 

参数: sleep是必需要传参数的,而wait传不传参数均可以.但不传参数的时候须要经过在代码块的里面最后一行加上notify或notifyAll来唤醒

是否释放锁: sleep是不释放锁的,而wait释放锁.

附上一个简单的代码来讲明一下如图:

public void print2() throws InterruptedException {
		synchronized(this) {
			if(flag != 2) {
				this.wait();
			}
			System.out.print("我");
			System.out.print("是");
			System.out.print("袁");
			System.out.print("翱");
			System.out.print("\r\n");
			flag = 1;
			this.notify();
		}
	}
}

下面说一下多线程的实现方式:

方式一:继承Thread
 

* 定义类继承Thread
	 //重写run方法
	 //把新线程要作的事写在run方法中
	 //建立线程对象
	 //开启新线程, 内部会自动执行run方法
	 
		
			public class Demo2_Thread {
		
				/**
				 * @param args
				 */
				public static void main(String[] args) {
					MyThread mt = new MyThread();				//4,建立自定义类的对象
					mt.start();						//5,开启线程																				
					for(int i = 0; i < 3000; i++) {
						System.out.println("bb");
					}
				}
			
			}
			class MyThread extends Thread {						//1,定义类继承Thread
				public void run() {																					//2,重写run方法
					for(int i = 0; i < 3000; i++) {				//3,将要执行的代码,写在run方法中
						System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
					}
				}
			}


方式二:实现Runnable

* 定义类实现Runnable接口
	// 实现run方法
	// 把新线程要作的事写在run方法中
	// 建立自定义的Runnable的子类对象
	// 建立Thread对象, 传入Runnable
	// 调用start()开启新线程, 内部会自动调用Runnable的run()方法

			public class Demo3_Runnable {
				/**
				 * @param args
				 */
				public static void main(String[] args) {
					MyRunnable mr = new MyRunnable();			//4,建立自定义类对象
					//Runnable target = new MyRunnable();
					Thread t = new Thread(mr);	//5,将其看成参数传递给Thread的构造函数							t.start();		//6,开启线程																											
					for(int i = 0; i < 3000; i++) {
						System.out.println("bb");
					}
				}
			}
			
			class MyRunnable implements Runnable {					//1,自定义类实现Runnable接口
				@Override
				public void run() {						//2,重写run方法															
					for(int i = 0; i < 3000; i++) {				//3,将要执行的代码,写在run方法中
						System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
					}
				}
				
			}


以上两种方法均可实现多线程.

 

 

 

 

 有不少不足,但愿你们给点建议,我会加以改正.谢谢.