------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
多线程见名知意就是多个线程,学习多线程直线我们先看个图解大概了解一下多线程的生命周期,方便学习:
用生活中的例子来说多线程就是:比如我们平时坐的公交车和地铁我们的出发和目的地都是一样的.不过我们即可通过乘坐公交车的形式,也可以通过乘坐地铁的形式来到达目的地.虽然我们的出发地和目的地是一样的但是我们可以通过不同的方式实现,以避免拥堵,这样就避免了道路上的阻塞,如果没有地铁只有公交车虽有人都去挤公交车那么就会显的非常的拥堵,这样映射到我们的多线程相信大家应该提现到多线程的好处.实现了每条线程的高效.
我们既然说到线程就要和进程来区分一下,那么他们之间到底有什么联系呢?
其实线程就是进程通过的途径,那么进程呢?
我们在启动电脑的任务管理器的时候工具栏都有一个进程的选项,点开这个进程我们就能看到电脑上正在进行的程序.这个就是我们所说的进程,也就是进行的程序.
在上图中我们还看到了线程的阻塞,就好比是马路上的红绿灯一样.红灯的时候我们需要等待,其实就是休眠就是图上锁说的sleep和wait方法.绿灯的时候又抢到了CPU的执行选,所以线程继续开始.
既然我们说到了sleep和wait那么他们之间又有什么关系呢?
我们主要是通过他们的区别来介绍.
主要分为4个方面:位置,类,参数,是否释放锁
位置: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");
}
}
}
以上两种方法都可实现多线程.
有很多不足,希望大家给点建议,我会加以改正.谢谢.