在一个特定的主线程执行的过程中,如果我们还需要在主线程的过程中插播一个线程,做其他动作。那么我们就可以利用Java的Thread类,创建一个新的线程。
一:线程简单实现的三种方式
(1)第一种创建线程的方式是直接extends Thread 覆盖run()方法即可。代码如下:

------------------------------------------------------------------------------------------------

运行结果:这是主线程 这是线程A
这种实现的方式的缺点是,一个java类智能extends 继承一个父类,有的时候不免有点尴尬。
(2)第二种实现的方式是实现Runnable接口,实现run()方法。

---------------------------------------------------------------------------------

运行结果:这是主线程 这是子线程B
(3)第三种方式是 implements Callable,实现call()方法可以得到线程的执行结果;代码不在写。
二:什么是线程不安全
当多个线程同时操作一个数据结构的时候产生了相互修改和串行的情况,没有保证数据的一致性,我们同城称这种代码的设计为“线程不安全的”。
三:什么是线程安全
保证数据的高度一致性和准确性就叫线程安全的。
想实现线程安全大致可以有三种方法:
(1):多例模式,也就是不用单例模式;
(2):使用java.util.concurrent下面的类库;
(3):使用锁机制synchronized,lock方式;
四:synchronized和lock锁机制
(1):synchronized(同步锁)是java关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该代码块。
声明如下:
public synchronized void synMethon(){
//方法体
}
public int synMethod(int a1){
synchronized(this){
}
}
(2)Lock(显示锁)是一个接口提供了无条件的,可轮询的,定时的,可中断的锁获取操作,所有加锁和解锁的方法都是显式的。
使用方法如下:
class X{
private final ReentrantLock lock = new ReentrantLock ();
public void m(){
lock.lock();
try{
方法体
} catch(Exception e){
e.printStackTrace();
}finally{
lock.unlock()
}
}
}
Lock与synchronized的比较
a:Lock使用起来比较灵活,但必须有释放锁的动作配合;
b: Lock必须手动开启锁和释放锁的动作,而synchronized则不需要手动释放锁和开启锁;
c: Lock只适用与代码块加锁,而synchronized对象之间是互斥关系;
使用案例:
咖狗网中运价查询行为分析:
点击“搜索”按钮的时候,需要执行两个动作,一个是去查询,一个是行为分析;我们的主要目的是查询数据,在查询数据的同时,我们还需要进行行为分析。这个时候为了不影响功能性的操作,这个时候要启一个子线程。主线程执行查询功能,子线程去做行为分析。这两个线程互不影响。并行执行,异步执行。
主线程
————————————》 查询功能
|
|
|
子线程(行为分析)
比如一个接口A,B去实现这个接口,在B中:
通过构造函数传参
FreightActionCollectionForElclThread thread = new FreightActionCollectionForElclThread(0l,0l,wxid,loadportcode,dischargeportcode,null,'B');
启动线程
new Thread(thread).start();
线程类C中实现业务逻辑:
public class FreightActionCollectionForElclThread implements Runnable {
private Logger logger = LoggerFactory
.getLogger(FreightActionCollectionForElclThread.class);
private HttpServletRequest request;
private char actiontype; // A整箱点击,B整箱查询
//微信ID
private String wxId;
//起运港
private String loadportCode;
//目的港
private String dischargeportCode;
//中转港
private String transperport_code;
//船公司
private String carrier_enname;
private Long productElclId;
private Long freightElclId;
//org_id,平台ID
private Long company_id;
//产品ID
private Long product_id;
public FreightActionCollectionForElclThread(Long productElclId,Long freightElclId,String wxId,
String loadportCode, String dischargeportCode,
HttpServletRequest request, char actiontype) {
this.productElclId = productElclId; //通过构造函数传参
this.freightElclId = freightElclId;
this.request = request;
this.actiontype = actiontype;
this.loadportCode = loadportCode;
this.dischargeportCode = dischargeportCode;
this.wxId = wxId;
}
@Override
public void run() {
System.err.println("Thread -------------------------->:start!");
try {
String login_name ="";//通过wxid查询login_name
long menm_id = 0l;//通过wxid查询contract_id
PHPRPCClientService a_clientService = SpringContextHolder
.getBean("analysisPHPRPCService");
IFreightAnalysisSortService ist = a_clientService
.getPHPRPCService(IFreightAnalysisSortService.class);
//通过微信ID查询会员信息
PHPRPCClientService rclientService = SpringContextHolder.getBean("mmembershipPHPRPCService");
IMemberService is = rclientService.getPHPRPCService(IMemberService.class);
Member mb = is.getByWxId(wxId);
if(mb!=null){
//↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓add by liuwei 20151124 微信查询行为采集,微信Id替换成手机号码或者邮箱 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
String loginName = null;
Long orgId = mb.getPlatformId();
Long userId = mb.getUserId();
List<MemBinding> list = new ArrayList<MemBinding>();
IMemBinding memBind = rclientService.getPHPRPCService(IMemBinding.class);
list = memBind.getBindings(userId, orgId);
if(list != null && list.size()>0){
for(int i=0;i<list.size();i++){
Integer mode = list.get(i).getBindLoginMode();
if(mode != null && (mode.intValue() == 100 || mode.intValue() == 50)){
loginName = list.get(i).getBindLoginName();
}
}
}
login_name = loginName;
//↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑add by liuwei 20151124 微信查询行为采集,微信Id替换成手机号码或者邮箱 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//login_name = mb.getLoginName();
menm_id = mb.getMembId();
}
//通过productEfclId,freightEfclId 查询运价详情
Map<String,Object>map= new HashMap<String,Object>();
map.put("productElclId",productElclId);
map.put("freightElclId",freightElclId);
PHPRPCClientService clientService = SpringContextHolder.getBean("freightElclPHPRPCService");
IFreightElclProductService service = clientService.getPHPRPCService(IFreightElclProductService.class);
FreightElclDetailsVo freightElclDetailsVo=service.getFreightElclDetailsVo(map);
if(freightElclDetailsVo!=null){
company_id = freightElclDetailsVo.getOrgId();
product_id = freightElclDetailsVo.getProductElclId();
loadportCode = freightElclDetailsVo.getFreightElclProduct().getLoadport();
dischargeportCode = freightElclDetailsVo.getFreightElclProduct().getDischargeport();
transperport_code = freightElclDetailsVo.getTransferport();
carrier_enname = freightElclDetailsVo.getFreightElclProduct().getCarrierEnname();
}
switch (actiontype) {
case 'A':
// 拼箱产品点击行为分析
FreightPO fpo = new FreightPO();
fpo.setBi_create_time(new Date());
fpo.setBi_action_name("pm_freight_analysis_action");
fpo.setContact_id(menm_id);
fpo.setBind_login_name(login_name);
fpo.setCompany_id(company_id);
fpo.setAnalysis_freight_type("拼箱");
fpo.setProduct_id(product_id);
fpo.setLoadport_code(loadportCode);
fpo.setDischargeport_code(dischargeportCode);
fpo.setTransperport_code(transperport_code);
fpo.setCarrier_enname(carrier_enname);
fpo.setCreate_date(new Date().getTime());// 登录时间
fpo.setReside_date(0l);// 停留时间
fpo.setSource("微信");
ist.freightActionCollectForElcl(fpo, request);
break;
case 'B':
// 拼箱产品查新行为分析
FreightQueryPO queryfpo = new FreightQueryPO();
queryfpo.setBi_create_time(new Date());// 行为应用服务器时间。
queryfpo.setBi_action_name("pm_freight_query_analysis_action");
queryfpo.setContact_id(menm_id);
queryfpo.setBind_login_name(login_name);
queryfpo.setAnalysis_freight_type("拼箱");
queryfpo.setLoadport_code(loadportCode);
queryfpo.setDischargeport_code(dischargeportCode);
queryfpo.setCarrier_enname("");
queryfpo.setQuery_date(new Date().getTime());// 行为应用服务器时间。
queryfpo.setF_num(0l);// 查询出来 的数量
queryfpo.setSource("微信");
ist.freightQueryActionCollectForElcl(queryfpo, request);
break;
default:
break;
}
} catch (Exception e) {
logger.error("analysis failure", e);
}
System.err.println("Thread -------------------------->:end!");
}
}
- QVariant(相当于是Java里面的Object,起到一个数据类型“擦除”的作用,可以使用Q_DECLARE_METATYPE进行注册)
=QVariant= [%这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是 ...
- 转:JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原文链接:http://blog.csdn.net/wuxinliulei/article/details/11099565 java.l ...
- JAVA里面的“指针”
JAVA里面的“指针” 众所周知,在java里面是没有指针的.那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址.那么在Java里 ...
- java里面的package/import 和PHP里面的namespace/use 是一模一样的吗
java里面的package/import 和PHP里面的namespace/use 是一模一样的吗? java: php package mypage; namespace mypage; impo ...
- QVariant(相当于是Java里面的Object,是万能的容器,但要注册)
这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型“擦除”的作用.比如我们的 table单元格可以是string,也可以是int,也可以是一个颜色值 ...
- JAVA里面的int类型 和Integer类型,有什么不一样
JAVA里面的int类型 和Integer类型,有什么不一样 原创 2013年09月04日 23:15:11 标签: java / 2120 编辑 删除 JAVA里面的int类型 和Integer类型 ...
- java里面的public static void main(String[] args)
package com.java_1; public class Hello { public static void main(String[] args){ System.out.println( ...
- JAVA里面的IO流(一)分类2(节点流和处理流及构造方法概要)
IO流根据处理对象的不同分为节点流和处理流. 直接对文件进行处理的流为节点流: 对流进行包装从而实现对文件的优化处理的流为处理流. 节点流类型: 可以看出,节点流主要分这几大类: 文件流 文件流构造方 ...
- java 里面的 native 方法
第一篇: 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地讲,一个Native Meth ...
随机推荐
- 2014年亚洲区域赛北京赛区现场赛A,D,H,I,K题解(hdu5112,5115,5119,5220,5122)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 下午在HDU上打了一下今年北京区域赛的重现,过了5题,看来单挑只能拿拿铜牌,呜呜. ...
- UVA11401Triangle Counting(简单计数)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 题目意思:从1,2,3,……,n中选出3个不同的整数使其构成一个三角形,有多少种方 ...
- self parent $this关键字分析--PHP
self : 调用本类的静态方法和属性,常量 parent :调用父类的静态方法.属性.普通方法.构造函数,不能调用父类的普通属性 $this : 调用本类的普通方法和属性,如果本类没有就 ...
- ImageView一例
参考自<疯狂android讲义>2.4节 效果如下: 当点击图上某点时,将之附近放大至下图. 布局文件: <LinearLayout xmlns:android="http ...
- [Netty 1] 初识Netty
1. 简介 最早接触netty是在阅读Zookeeper源码的时候,后来看到Storm的消息传输层也由ZMQ转为Netty,所以决心好好来研究和学习一下netty这个框架. Netty项目地址:htt ...
- 容器的深入研究(二)—Set与Map
一.Set类的作用 二.Set类延生的四种形式 三.非基础类型如何使用Set的四种形式 四.Queue的使用 五.PriorityQueue的使用 六.Map的六种形式 七.HashMap散列码的实现 ...
- QT中的OpcDa 客户端 实现
前段时间开发Windows下的设备端软件接触到了OPC DA,虽然现在有了更强大的OPC UA,但是为了兼容一些老的设备,不得不硬着头皮去啃这个老掉牙的已经过时了的技术.本来只是想粗略了解一下,简单写 ...
- dreamweaver批量去除空格,空行
制作网店的时候,发现有空行,或者空格.如果数量比较少,可以手动清除.如果多的话,可以使用dreamweaver批量去除.方法如下: 第一步,用正则表达式删除所有空白行(其实这一步不一定要做,我只是为了 ...
- 【Xamarin挖墙脚系列:开始使用Xamari4.0系列产品开发IOS】
一直沉默在Xamarin3.0系列版本上,升级到4.0之后,感觉有些变化.还得适应下. 1 build.host 代理消失了,成了SSH客户端登录.所以,Mac设备需要打开运行远程登录. 2 在Wi ...
- Eclipse选中变量名,相同变量都变色显示
Eclipse选中变量名,相同变量都变色显示 java文件的设置"Window"-"preferences"-"Java"-"Ed ...