多线程(多线程原理)


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

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

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

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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值