시나닷컴 면접문제-다선정 합병 파일
11170 단어 Java 동시 프로그래밍
주 프로그램
package com.huang;
import org.apache.log4j.Logger;
import java.util.concurrent.*;
/**
* , ,
* Created by root on 16-9-1.
*/
public class Main {
private static final Logger MAIN_LOGGER=Logger.getLogger(Main.class);
private static final Logger CON_LOGGER=Logger.getLogger(Consumer.class);
private static final Logger PRO_LOGGER=Logger.getLogger(Producer.class);
private static final ExecutorService POOL;
//
private static final BlockingQueue BLOCKING_QUEUE = new LinkedBlockingQueue();
static{
// CPU
int cpuNum=Runtime.getRuntime().availableProcessors();
// IO , CPU N+1
POOL= Executors.newFixedThreadPool(2*cpuNum+1);
}
public static void main(String args[]){
String in[]={"/tmp/a","/tmp/b","/tmp/c"};
String out="/tmp/d";
for(int i=0;inew Producer(BLOCKING_QUEUE,in[i],PRO_LOGGER));
}
POOL.shutdown();
new Thread(new Consumer(BLOCKING_QUEUE,CON_LOGGER,out,in.length)).start();
}
}
프로듀서
package com.huang;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
/**
*
* Created by root on 16-8-31.
*/
public class Producer implements Runnable{
private BlockingQueue blockingQueue;
private String filePath;
private Logger logger;
public Producer(BlockingQueue blockingQueue,String filePath,Logger logger) {
this.blockingQueue=blockingQueue;
this.filePath=filePath;
this.logger=logger;
}
@Override
public void run() {
try {
Byte[] data=FileOperate.toArray(FileOperate.getFileByte(filePath));
blockingQueue.add(data);
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
}
컨슈머
package com.huang;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
/**
*
* Created by root on 16-8-31.
*/
public class Consumer implements Runnable{
private final BlockingQueue blockingQueue;
private Logger logger;
private String outFile;
private int num;
public Consumer(BlockingQueue blockingQueue,Logger logger,String outFile,int num){
this.blockingQueue=blockingQueue;
this.logger=logger;
this.outFile=outFile;
this.num=num;
}
@Override
public void run() {
while(true){
try {
Byte[] bytes=blockingQueue.take();
FileOperate.writeByte(outFile,bytes);
if(--num==0)
break;
} catch (InterruptedException e) {
logger.error(e.getMessage(),e);
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
}
}
파일 작업 도구 클래스
package com.huang;
import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Created by root on 16-8-31.
*/
public class FileOperate {
/**
* NIO
* @param filePath
* @param bytes
* @throws IOException
*/
public static void writeByte(String filePath,Byte[] bytes) throws IOException {
Lock lock=new ReentrantLock();
File outFile=new File(filePath);
if(!outFile.exists())
outFile.createNewFile();
try(FileOutputStream fileOutputStream=new FileOutputStream(outFile,true); FileChannel fileChannel=fileOutputStream.getChannel();){
ByteBuffer bf=ByteBuffer.wrap(getBytes(bytes));
fileChannel.write(bf);
}
}
/**
* NIO
* @param filePath
* @return
* @throws IOException
*/
public static List getFileByte(String filePath) throws IOException {
File inFile=new File(filePath);
List bytes=null;
try (FileInputStream fileInputStream= new FileInputStream(filePath); FileChannel fc=fileInputStream.getChannel();){
bytes=new ArrayList<>();
ByteBuffer bf=ByteBuffer.allocate(1024);
while(fc.read(bf)!=-1) {
bf.flip();
while(bf.hasRemaining())
bytes.add(bf.get());
bf.clear();
}
} catch (FileNotFoundException e) {
throw new RuntimeException(filePath+" ");
}
return bytes;
}
public static Byte[] toArray(List list){
Byte[] result=new Byte[list.size()];
for(int i=0;ireturn result;
}
public static byte[] getBytes(Byte[] bytes){
byte[] result=new byte[bytes.length];
for(int i=0;ireturn result;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
countdowlatch와cyclicbarrier의 용법 및 차이한 임무가 아래로 내려가려고 하지만 다른 임무가 끝난 후에야 계속 아래로 내려갈 수 있다.만약 우리가 계속 실행하고자 하는 이 임무는 CountDownLatch 대상의await () 방법을 사용하고, 다른 임무는 자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.