高併發的簡單處理方法
阿新 • • 發佈:2019-02-08
1.定義一個類:
package com.lijie.xcaq;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Logger;
/**
* Lijie
*
*/
public class ThreadUtil {
private static final Logger log = Logger.getLogger(ThreadUtil.class);
private static final ConcurrentHashMap<String, Long> cmap = new ConcurrentHashMap<String, Long>();
public synchronized static boolean getLock(String key, int timeOut) {
Long valueLong = cmap.get(key);
if (null == valueLong) {
cmap.put(key, new Date().getTime());
log.info("the first time get the lock");
return true;
}
Long valueNow = new Date().getTime();
if ((valueNow - valueLong) < timeOut) {
log.error("can not get the lock!");
return false;
}else{
cmap.put(key, valueNow);
log.warn("can get the lock!");
}
return false;
}
public synchronized static void relaseLock(String key){
cmap.remove(key);
log.info("relase the lock!");
}
}
2.測試
package com.lijie.xcaq;
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
Thread b = new B();
Thread c = new C();
if(ThreadUtil.getLock("my.lock", 5000)){
b.start();
// ThreadUtil.relaseLock("my.lock");
}
if(ThreadUtil.getLock("my.lock", 5000)){
c.start();
// ThreadUtil.relaseLock("my.lock");
}
}
}
class B extends Thread {
@Override
public void run() {
int i = 0;
while (i < 1000) {
i++;
System.out.println("BBBBBBBBBBBBBBBBBBBB");
}
}
}
class C extends Thread {
@Override
public void run() {
int i = 0;
while (i < 1000) {
i++;
System.out.println("CCCCCCCCCCCCCCCCCCCCCCC");
}
}
}
3.other
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>xcaq</groupId>
<artifactId>xcaq</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>xcaq</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
log4j
# To change this license header, choose License Headers in Project Properties.
# To change this template file, choose Tools | Templates
# and open the template in the editor.
log4j.rootLogger=INFO,dailyFile
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=INFO
log4j.appender.console.ImmediateFlush=true
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss SSS}-->[%t] %C: %m %n
#\u6BCF\u5929\u4EA7\u751F\u4E00\u4E2A\u65E5\u5FD7
log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyFile.File=d:/logs/eclipse
log4j.appender.dailyFile.Append=true
log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH\:mm\:ss SSS}-->[%t] %C: %m %n
log4j.appender.dailyFile.Threshold=INFO
log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd'.log'