11.多线程
在任何一种开发语言中,多线程处理都是一种比较复杂的处理方式,需要掌握好多知识点,才能开发一个完整的多线程应用。
在开发多线程时,需要注意的事项包括以下:
1、线程隔离,各个线程之间的数据是相互不影响的,没有先后顺序。
2、资源获取同步,比如售票,不能多个线程同时售同一张票。
3、多线程结束确认,必须得清楚何时多线程全部执行完。
下面简单介绍一个java原生多线程实现方式。
DealResource.java,多线程里面单个线程作为资源来进行处理
public class DealResource {
private int ticketCount;//定义车票张数
boolean flag = false; // 定义车票是否处理完
List<String> listTickets;// 定义所有车票
private static Object lock = new Object();// 定义锁,分配数据时不同步,处理数据时同步
public DealResource(int ticketCount,List<String> listTickets) {
this.ticketCount = ticketCount;
this.listTickets = listTickets;
}
/**
* synchronized线程安全
*/
public void doIni(MultiThread multiThread) {
String ticket = null;//定义该线程要处理的车票
synchronized (lock) {
if (ticketCount > 0) {
ticket = listTickets.get(ticketCount - 1);
ticketCount--;
} else {
flag = true;
}
}
if (ticket != null) {
if (!flag) {
System.out.println("已卖" + ticket);
}
}
}
}
这个类里面有几个核心的点需要理解:
1、 boolean flag 这个参数用于定义车票是否售完,售完的话即停止继续售票
2、private static Object lock = new Object();// 定义锁,分配数据时不同步,处理数据时同步,synchronized (lock)
这个可以保证分配资源时是同步的。
3、System.out.println("已卖" + ticket);
这一块是具体卖票的处理过程
synchronized (lock) {
if (ticketCount > 0) {
ticket = listTickets.get(ticketCount - 1);
ticketCount--;
} else {
flag = true;
}
}
这段代码就是当售完一张票,ticketCount
减一,直到为0
MultiThread.java 这个类负责资源传递,一般在开发中,这个类基本是不变的
public class MultiThread implements Runnable {
DealResource dealResource;// 定义车票资源
public MultiThread(DealResource dealResource) {
this.dealResource = dealResource;
}
public final void run() {
while (!dealResource.flag) {
/** * 调用资源类的同步方法 */
dealResource.doIni(this);
}
}
}
TestMultiThread .java,测试多线程
public class TestMultiThread {
/**
* 生产车票
*
* @return
*/
public List<String> createTickets() {
List<String> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add("车票" + i);
}
return list;
}
public void sellTicket() {
List<String> listTicket = createTickets();
DealResource dealResource = new DealResource(listTicket.size(), listTicket);
Vector<Thread> threads = new Vector<Thread>();
int threadNum = 10;// 定义线程数量
for (int i = 0; i < threadNum; i++) {
Thread iThread = new Thread(new MultiThread(dealResource));
threads.add(iThread);
iThread.start();
}
for (Thread iThread : threads) {
try {
// 等待所有线程执行完毕
iThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TestMultiThread testMultiThread = new TestMultiThread();
testMultiThread.sellTicket();
}
}
createTickets()
这个方法是生成要售的车票, 放到list里面
sellTicket()
这个是具体售票的处理过程,先定义DealResource
,把共有多少票,及车票的list放进去。Vector<Thread> threads = new Vector<Thread>();
,定义一个vector的thread容器。
Thread iThread = new Thread(new MultiThread(dealResource));
threads.add(iThread);
iThread.start();
这三句话是处理多线程的。
最后一段代码里面的 iThread.join();
是判断线程是否执行结束。
整体执行:
![](https://img.haomeiwen.com/i5463918/6caa3295a2e44daf.png)
按照这种模式开发多线程,主要步骤如下:
1、定义DealResource类,主要参数都差不多。
2、定义multiThread类,基本不用怎么动,目的是调用DealResource类
3、定义具体的多线程启动方法,按照给的例子一步一步复制粘贴即可。