java线程 对文件copy 可能删除了 报异常_java线程对文件copy可能删除了报异常
篇一:java中多線程操作文件的復制及剪切
方法,重命名此抽象路徑名表示的文件。相當于剪切并且重命名。但是此方法是與平臺相關的,重命名操作無法將一個文件從一個文件系統移動到另外一個文件系統。這是導致文件操作失敗的原因之一,還有的一個可能原因是:目標路徑已經存在此文件。
如果
如果
oldFile和newFile存在于不同的文件系統,則flag會返回false newFIle已經存在,則flag會返回false
在需要跨平臺且文件比較大的時候,采用多線程進行文件傳輸是不錯的選擇。以下為具體方法:
根據文件大小( x 字節),啟動 n 個線程( n = x/ β , β為常量),每個線程 i 以共享方式打開文件,從第 i* β個字節處開始讀取。
寫入文件同理,先創建 x 大小的文件,然后每個線程往第 i* β個字節處寫入。
n 的數量不能太多,常量β的值很重要,是可以配置的,一般設置為 20m。
具體操作代碼如下:
篇二:java實驗報告多線程異常處理
信 息 工 程 學 院
Java程序設計 實習報告
多線程異常處理
1.實驗目的
(1) 掌握Java的異常處理機制及相關實現方法能夠在程序設計中熟練運用異常及相關類及
對象;
(2) 掌握Java多線程的概念和實現方法;
(3) 掌握Java多線程的同步問題;
2.實驗內容
實驗題1 創建兩個線程,一個線程打印“A”,另一個線程打印“B”,比如ABBABAABBA….
主要代碼:
package package1;
public class TestThread {
}
package package1;
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Printout A_Print = new Printout('A'); Printout B_Print = new Printout('B'); A_Print.start(); B_Print.start(); }
實驗報告的內容與格式按任課教師的要求書寫。
public class Printout extends Thread {
public char out;
Printout(char temp){
}
} public void run(){ } for(int i=0;i<5;i++){ System.out.print(out); } out = temp;
運行結果:
實驗題 2 假設有火車票1000張,創建10個線程模擬10個售票點,每個售票點100毫秒買一張票。打印出售票過程,注意使用synchronized確保同一張票只能賣出一次。輸出格式如下:
第4售票點賣出第100張票
第2售票點賣出第101張票 ??
主要代碼:
package package2;
public class SellTicket extends Thread{
int Sellnum; static int Ticketnum = 0; SellTicket(int index){
} Sellnum = index; public void run(){ while(true){ synchronized(this){ if(Ticketnum<1000){ Ticketnum++; System.out.println("第"+Sellnum+"售票點賣出第
"+Ticketnum+"張票");
} } }} } else{ } try{Thread.sleep(500); } catch(InterruptedException e){} break; //return 1;
運行結果:
實驗題3 假設某家銀行,它可接受顧客的匯款,每做一次匯款,便可計算出匯款
的總額。現有兩個顧客,每人都分3次,每次100元將錢到入。試編寫一個程序,模擬實際作業。
程序如下:
class CBank
{ private static int sum=0;
public static void add(int n){
int tmp=sum;
tmp=tmp+n;// 累加匯款總額
try{
Thread.sleep((int)(10000*Math.random())); // 小睡幾秒鐘 }
catch(InterruptedException e){}
sum=tmp;
System.out.println("sum= "+sum);
}
}
class CCustomer extends Thread // CCustomer類,繼承自Thread類
{ public void run(){ // run() method
for(int i=1;i<=3;i++)
CBank.add(100); // 將100元分三次匯入
}
}
public class Ex6_1
{public static void main(String args[])
{ CCustomer c1=new CCustomer();
CCustomer c2=new CCustomer();
c1.start();c2.start();
}
}
[基本要求] 運行程序5次,觀察每次運行結果是否相同。
運行結果:
結果1 結果2 結果
3
結果4結果5
[思考問題] 程序運行結果每次是否相同,運行時間是否相同,為什么? 答:在add()函數前加synchronized關鍵字。
② 程序中為什么要使用異常處理?
答:程序調用了sleep()函數,可能被中斷,產生異常。
篇三:JAVA 多線程文件拷貝
import java.io.*;
importimportpublicclassFileOperationimplements Runnable{
publicvoid run(){
synchronized(""){
fileCopy("E:\\計算機應用", "C:/Users/Jiangjin/Desktop");}
}
booleanfileCopy(String oldpath,Stringnewpath){
File srcfile=new File(oldpath);//原文件絕對路徑
File destfile=new File(newpath+"/"+srcfile.getName());//新文件的文件路勁
if(!srcfile.exists())
returnfalse;
elseif(srcfile.isDirectory()){//如果是文件夾,則進行遞歸調用 if(!destfile.exists())
destfile.mkdir();
File allfile[]=srcfile.listFiles();
for(File x: allfile){
fileCopy(x.getAbsolutePath(),destfile.getAbsolutePath()); }
}
else {//如果是文件,則復制
try{
if(!destfile.exists()){
destfile.createNewFile();
FileInputStream in=newFileInputStream(srcfile);byte by[]=newbyte[(int)srcfile.length()];in.read(by);
FileOutputStream
out=newFileOutputStream(destfile);
out.write(by);
in.close();
out.close();
}
}catch(Exception e){
e.getMessage();
}
}
System.out.println(System.currentTimeMillis()/1000);returntrue;
}
publicstaticvoid main(String args[]){
System.out.println(System.currentTimeMillis()/1000);FileOperation file=newFileOperation();
file.fileCopy("E:\\計算機應用",
"C:/Users/Jiangjin/Desktop");//將文件復制到桌面
Thread t=newThread(newFileOperation());
t.start();
Thread t1=newThread(newFileOperation());
t1.start();
Thread t2=newThread(newFileOperation());
t2.start();
Thread t3=newThread(newFileOperation());
t3.start();
Thread t4=newThread(newFileOperation());
t4.start();
Thread t5=newThread(newFileOperation());
t5.start();
Thread t6=newThread(newFileOperation());
t6.start();
Thread t7=newThread(newFileOperation());
t7.start();
//System.out.println(System.currentTimeMillis()/1000); }
}
篇四:java多線程中的異常處理
在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說各個線程需要自己把自己的checked exception處理掉。這一點是通過java.lang.Runnable.run()方法聲明(因為此方法聲明上沒有throw exception部分)進行了約束。但是線程依然有可能拋出unchecked exception,當此類異常跑拋出時,線程就會終結,而對于主線程和其他線程完全不受影響,且完全感知不到某個線程拋出的異常(也是說完全無法catch到這個異常)。JVM的這種設計源自于這樣一種理念:“線程是獨立執行的代碼片斷,線程的問題應該由線程自己來解決,而不要委托到外部。”基于這樣的設計理念,在Java中,線程方法的異常(無論是checked還是unchecked exception),都應該在線程代碼邊界之內(run方法內)進行try catch并處理掉.
但如果線程確實沒有自己try catch某個unchecked exception,而我們又想在線程代碼邊界之外(run方法之外)來捕獲和處理這個異常的話,java為我們提供了一種線程內發生異常時能夠在線程代碼邊界之外處理異常的回調機制,即Thread對象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。
通過該方法給某個thread設置一個UncaughtExceptionHandler,可以確保在該線程出現異常時能通過回調UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法來處理異常,這樣的好處或者說目的是可以在線程代碼邊界之外(Thread的run()方法之外),有一個地方能處理未捕獲異常。但是要特別明確的是:雖然是在回調方法中處理異常,但這個回調方法在執行時依然還在拋出異常的這個線程中!
比之上述方法,還有一種編程上的處理方式可以借鑒,即,有時候主線程的調用方可能只是想知道子線程執行過程中發生過哪些異常,而不一定會處理或是立即處理,那么發起子線程的方法可以把子線程拋出的異常實例收集起來作為一個Exception的List返回給調用方,由調用方來根據異常情況決定如何應對。不過要特別注意的是,此時子線程早以終結。
總結
以上是生活随笔為你收集整理的java线程 对文件copy 可能删除了 报异常_java线程对文件copy可能删除了报异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中有哪几种注释方式_在 Java
- 下一篇: java springboot 搭建_s