多线程加强之线程解析

一、多线程内存:代码实质上放在栈中运行,多线程实质是新开栈内存,然后多个栈互相抢cpu资源  时间片已到再抢cpu资源。

二、多线程中要加锁:1 同步方法 2同步块

多线程互斥共享“基本数据类型数据资源”--->基本数据类型的变量不能当做锁,因为互斥锁是对象锁,锁的是对象。所以我们的解决方法为:1   如果这个对象是静态的,那么我们新建一个与共享的“基本数据类型”资源平级的static对象来代替对象锁。2如果是类的非静态成员,可以直接用this来代替。  我们要锁同一个对象,在同一个类中用静态变量,在非同一个类中我们用传参来实现。

三、在方法上加锁,锁的对象是方法的拥有者。

面试题:

火车卖票 1-200张票 4个窗口卖 要求输出每个窗口卖出哪张票

版本一:

SaleTicket类:

package cn.hncu.thread.ticket.v1;
/**
 * 200张火车票分四个窗口卖出去,输出卖的票
 * 
 * @author <a href="mailto:wyj950411@foxmail.com">军街</a>
 *
 * @version 1.0 2016-4-21
 */
public class SaleTicket {
	public static void main(String[] args) {
		TicketWindow tw1 = new TicketWindow("窗口1");
		Thread t1 = new Thread(tw1);
		
		
		TicketWindow tw2 = new TicketWindow("窗口2");
		Thread t2 = new Thread(tw2);
		
		
		TicketWindow tw3 = new TicketWindow("窗口3");
		Thread t3 = new Thread(tw3);
		
		
		TicketWindow tw4 = new TicketWindow("窗口4");
		Thread t4= new Thread(tw4);
		
//		Thread t1=new TicketWindow("窗口1");
//		Thread t2=new TicketWindow("窗口2");
//		Thread t3=new TicketWindow("窗口3");
//		Thread t4=new TicketWindow("窗口4");
		
		
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

TicketWindow类:

package cn.hncu.thread.ticket.v1;

public class TicketWindow implements Runnable{
	private String name;
	private static int num=20000;
	private static Object obj = new Object();
	public TicketWindow(String name) {
		this.name = name;
	}
	@Override
	public void run() {
		while (true) {
			synchronized (obj) {
				if (num > 0) {
					System.out.println(name + ":" + num--);
				}else{
					break;
				}
			}
		}
	}

}
版本二:

SaleTicket 类

package cn.hncu.thread.ticket.v2;

public class SaleTicket {
	public static void main(String[] args) {
		TicketWindow tw1=new TicketWindow();
		
		Thread t1=new Thread(tw1);
		t1.start();
		
		Thread t2=new Thread(tw1);
		t2.start();
		
		Thread t3= new Thread(tw1);
		t3.start();
		
		Thread t4=new Thread(tw1);
		t4.start();
	}

}

TicketWindow类:

package cn.hncu.thread.ticket.v2;

public class TicketWindow implements Runnable{
	private int num=200;
	@Override
	public void run() {
		synchronized (this) {
			while (true) {
				if (num > 0) {
					System.out.println(num);
					num--;
				} else {
					break;
				}
			}
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值