多线程(多线程原理)

来源:互联网 发布:网络推广炒作 编辑:程序博客网 时间:2024/05/29 09:38


我们首先要知道什么是多线程,说白了就是多个线程,线程是什么呢,其实就是进程运行的途径,那么说道这里我们又引入了一个新的名字,就是进程,那么我们来看看什么是进程,其实我们自己也能看到,启动电脑的任务管理器,我们就可以看到进程选项,里面是我们电脑所有的进程,我们会发现有很多的进程.

简单地说就是进程就是我们所运行的程序,线程就是进程运行的途径.

那么引入多线程有什么好处呢?

那么我们用生活中的例子来想想一下,最简单的就是普通的道路和高架桥,相信大家都知道北京的道路是很堵的,那么你能想象如果把高架桥拆除,所有的车辆都走普通道路的景象吗?那么这就是多线程的优势了,目的地只有一个,可是我们可以有多条路径可以到达目的地.大大的提高了运行效率.

public static void main(String[] args) {new Thread() {//1,继承Thread类public void run() {//2,重写run方法for(int i = 0; i < 1000; i++) {//3,将要执行的代码写在run方法中System.out.println("aaaaaaaaaaaaaa");}}}.start();//4,开启线程new Thread(new Runnable() {//1,将Runnable的子类对象传递给Thread的构造方法public void run() {//2,重写run方法for(int i = 0; i < 1000; i++) {//3,将要执行的代码写在run方法中System.out.println("bb");}}}).start();//4,开启线程}
通过以上代码我们还可以知道要想实现多线程有两种方式,一种是继承Thread类,重写当中的run()方法,另一种是实现Runnable接口重写run()方法,这样就能实现多线程.

但是因为电脑只有一个cpu,尽管现在电脑一代一代在进化,四核八核,但是万变不离其宗,我们程序要实现多线程运行程序,那么就会有一个资源共享问题,cpu资源是要被共享的,你用了我就不能用,为了避免出现这种情况,我们提出了锁机制.

关键字是synchronized.

public static synchronized void print1() {//同步方法只需要在方法上加synchronized关键字即可System.out.print("我");System.out.print("是");System.out.print("令");System.out.print("狐");System.out.print("冲");System.out.print("\r\n");}public static void print2() {synchronized(Printer2.class) {//同步代码块System.out.print("我");System.out.print("是");System.out.print("任");System.out.print("盈");                        <pre name="code" class="java">                        System.out.print("盈");
 System.out.print("\r\n");}}

以上两种方法都是静态的方法,是直接可以通过类名.class直接上锁的,而非静态则不可以,我们下面会说明.

那么我们可以通过synchronized给同步方法和同步代码块加锁,这里有print1()和print2两种方法,他们如果都去抢一个线程,那么就会出现错乱的字符了,我们想要的是"我是令狐冲"和"我是任盈盈"交替输出,上了锁就不一样了,在print1()方法执行的时候,print2()是不会和它抢占线程 的,相反print2()方法也是一样的.

那么在这里我们说到了同步方法和同步代码块的问题,那么我们上了锁就说明它是同步的,那么我们应该怎么区分同步方法和同步代码块呢?

第一,就是他们的锁上的位置是不一样的,同步方法的锁是直接加载方法声明上就可以了,而同步代码块的锁是加在一个代码块的前面;

第二,就是他们的锁对象是不一样的,同步方法的锁可以是任意的对象,而同步代码块则不行,它的锁必须是this对象,这个this也就是说,你new的是哪个对象,那么this就指向谁.用下面的代码来说明一下:

public void run() {while(true) {synchronized(this) {if(tickets <= 0) {break;}try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "...这是第" + tickets-- + "号票" );}}}
这是一个简单的火车票售票系统,我只粘贴了一部分来说明一下,synchronized锁的这个就是同步代码块,它的所对象必须是this对象.

0 0