11.多线程
在任何一种开发语言中,多线程处理都是一种比较复杂的处理方式,需要掌握好多知识点,才能开发一个完整的多线程应用。
在开发多线程时,需要注意的事项包括以下:
1、线程隔离,各个线程之间的数据是相互不影响的,没有先后顺序。
2、资源获取同步,比如售票,不能多个线程同时售同一张票。
3、多线程结束确认,必须得清楚何时多线程全部执行完。
下面简单介绍一个java原生多线程实现方式。
DealResource.java,多线程里面单个线程作为资源来进行处理
public class DealResource {
private int ticketCount;
//定义车票张数
boolean flag = false;
// 定义车票是否处理完
List listTickets;
// 定义所有车票
private static Object lock = new Object();
// 定义锁,分配数据时不同步,处理数据时同步public DealResource(int ticketCount,List 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
减一,直到为0MultiThread.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 createTickets() {
List list = new ArrayList<>();
for (int i = 0;
i < 100;
i++) {
list.add("车票" + i);
}
return list;
}public void sellTicket() {
List listTicket = createTickets();
DealResource dealResource = new DealResource(listTicket.size(), listTicket);
Vector threads = new Vector();
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 threads = new Vector();
,定义一个vector的thread容器。Thread iThread = new Thread(new MultiThread(dealResource));
threads.add(iThread);
iThread.start();
这三句话是处理多线程的。
最后一段代码里面的
iThread.join();
是判断线程是否执行结束。整体执行:
文章图片
多线程处理 按照这种模式开发多线程,主要步骤如下:
1、定义DealResource类,主要参数都差不多。
2、定义multiThread类,基本不用怎么动,目的是调用DealResource类
3、定义具体的多线程启动方法,按照给的例子一步一步复制粘贴即可。
源码下载 【11.多线程】本工程详细源码
推荐阅读
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 爱就是希望你好好活着
- 昨夜小楼听风
- 知识
- 死结。
- 我从来不做坏事
- 烦恼和幸福
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- Linux下面如何查看tomcat已经使用多少线程
- 说得清,说不清