前提我要写个线程,对多个文件进行写操作。
当有触发某个东西的时候,我就要启动一次这个线程进行写操作。
问题来了,就是前面的还没写完,后面又启动了一个线程进行写操作,这样就不行。(刚好同时对一个文件进行操作)
现在我想要对这个文件加锁,当前面有线程在对这个文件写操作时,就让后面要操作的线程等待,等前面的写完了,我就让后面等待的去操作。
有哪位大神告诉我该怎么实现,光是加把锁不可靠呀,后面的线程就不会等待对此继续操作了,有哪位大神能告诉我该怎么加锁怎么写么?
//对该文件加锁(这是我在网上找的,不行)
FileOutputStream out=new FileOutputStream(file,true);
FileChannel fcout=out.getChannel();
FileLock flout=null;
while(true){
flout=fcout.tryLock();
if(flout!=null){
break;
}
else{
System.out.println("有其他线程正在操作该文件,当前线程休眠1000毫秒");
sleep(100);
}
}java多线程file加锁
当有触发某个东西的时候,我就要启动一次这个线程进行写操作。
问题来了,就是前面的还没写完,后面又启动了一个线程进行写操作,这样就不行。(刚好同时对一个文件进行操作)
现在我想要对这个文件加锁,当前面有线程在对这个文件写操作时,就让后面要操作的线程等待,等前面的写完了,我就让后面等待的去操作。
有哪位大神告诉我该怎么实现,光是加把锁不可靠呀,后面的线程就不会等待对此继续操作了,有哪位大神能告诉我该怎么加锁怎么写么?
//对该文件加锁(这是我在网上找的,不行)
FileOutputStream out=new FileOutputStream(file,true);
FileChannel fcout=out.getChannel();
FileLock flout=null;
while(true){
flout=fcout.tryLock();
if(flout!=null){
break;
}
else{
System.out.println("有其他线程正在操作该文件,当前线程休眠1000毫秒");
sleep(100);
}
}java多线程file加锁
(2)为什么要启用那么多线程呢?你如果每次都写到的是同一个文件里面,采用一个LinkedBlockingQueue,需要生成的数据每次添加到队列里面,由一个线程负责写,每次从队列中取一个数据,这个QUEUE本身就是线程安全的
这位博主的实现目标和我的差不多,但是我用博主的代码运行,它是能阻止后面的线程进行操作,但是前面的线程执行完了,后面那个被阻止的线程就不会继续执行了,而且会报一个错误,谁能帮我解决下,~~!!!
public static int byteArrayToInt(byte[] b) {
int value= 0;
for (int i = 0; i < b.length; i++) {
int shift= (b.length - 1 - i) * 8;
value +=(b[i ] & 0x000000FF) << shift;
}
return value;
}
static LinkedList<Runnable> runnables = new LinkedList<Runnable>() ;
public static void main(String[] args){
for (int i = 0; i < 10; i++) {
TestFileOutput fileOutput = new TestFileOutput() ;
runnables.add(fileOutput) ;
}
new Thread(new Test()).start() ;
}
public static void add(TestFileOutput fileOutput){
runnables.add(fileOutput) ;
}
@Override
public void run() {
while(runnables.size()> 0){
runnables.removeFirst().run() ;
}
}
}
/*
* 我文件操作线程
*/
class TestFileOutput implements Runnable{ @Override
public void run() {
System.out.println("进入线程操作");
try {
//睡眠一秒,模拟线程操作文件
Thread.sleep(1000) ;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("完成线程操作");
}
}