1. 程式人生 > >高併發的簡單處理方法

高併發的簡單處理方法

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'