スレッド・ノット
4554 ワード
1.スレッド
各javaプログラムには、少なくとも1つのスレッド、プライマリスレッドがあります.Javaプログラムが実行されると、JVMはメインスレッドを作成し、このスレッドでメイン関数のメソッドを呼び出します.
スレッドは単一スレッドとマルチスレッドに分けられます
シングルスレッドたんすと:シーケンシャルコールシーケンシャルコール
例:ma(){
mb();
mc();
print(a);
}
mb(){
md();
print(b);
}
mc(){
print(c);
}
最終出力結果は順次出力されます
マルチスレッド:
複数のメソッドを同時に実行
例ma(){
Thread.start();mb();
Thread.start();mc();
Thread.start();md();
print(a);
}
mb(){
print(b);
}
mc(){
print(c);
}
md(){
print(d);
}
どの方法が先に実行されるかは必ずしも方法の内容によるものではない.
2.スレッドとプロセスの違い
1.アプリケーションはプロセス(進行中のアプリケーション)であり、スレッドはプログラム内の複数の実行単位である.
2.複数のプロセス内のデータは独立しており、プロセス内の通信の多くはネットワークによって実現されなければならない.スレッドでは共有されます(同じプロセス).
3.スレッド自体のデータは通常、レジスタデータと1つのプログラム実行時に使用されるスタックのみであるため、スレッド切替の負担はプロセス切替の負担よりも小さい.
3.スレッド実装方法
1.Threadクラスの継承
2.Runnableインタフェースの実装
3.匿名内部クラス
メイン関数で呼び出す
継承インタフェース:
匿名の内部クラス
各javaプログラムには、少なくとも1つのスレッド、プライマリスレッドがあります.Javaプログラムが実行されると、JVMはメインスレッドを作成し、このスレッドでメイン関数のメソッドを呼び出します.
スレッドは単一スレッドとマルチスレッドに分けられます
シングルスレッドたんすと:シーケンシャルコールシーケンシャルコール
例:ma(){
mb();
mc();
print(a);
}
mb(){
md();
print(b);
}
mc(){
print(c);
}
最終出力結果は順次出力されます
マルチスレッド:
複数のメソッドを同時に実行
例ma(){
Thread.start();mb();
Thread.start();mc();
Thread.start();md();
print(a);
}
mb(){
print(b);
}
mc(){
print(c);
}
md(){
print(d);
}
どの方法が先に実行されるかは必ずしも方法の内容によるものではない.
2.スレッドとプロセスの違い
1.アプリケーションはプロセス(進行中のアプリケーション)であり、スレッドはプログラム内の複数の実行単位である.
2.複数のプロセス内のデータは独立しており、プロセス内の通信の多くはネットワークによって実現されなければならない.スレッドでは共有されます(同じプロセス).
3.スレッド自体のデータは通常、レジスタデータと1つのプログラム実行時に使用されるスタックのみであるため、スレッド切替の負担はプロセス切替の負担よりも小さい.
3.スレッド実装方法
1.Threadクラスの継承
2.Runnableインタフェースの実装
3.匿名内部クラス
/**
*
* @author Administrator
*
*/
public class CountFileThread extends Thread{
private String rootDirName;
/**
*
* @param root
*/
public CountFileThread(String root){
this.rootDirName = root;
}
// : start run
public void run(){
long start =System.currentTimeMillis();
int fileCount = countDir(this.rootDirName);
long timeCost=System.currentTimeMillis();
System.out.println("------- :"+fileCount+" ( : )"+timeCost/1000);
}
private int countDir(String dir){
int count=0;//
File dirFile = new File(dir);
if(!dirFile.exists()){//
return count;
}
File[] subfile = dirFile.listFiles();
if(subfile==null){//
return count;
}
for(int i=0;i<subfile.length;i++){
if(subfile[i].isDirectory()){
count+=countDir(subfile[i].getAbsolutePath());
}
if(subfile[i].isFile()){
count++;
}
}
return count ;
}
}
メイン関数で呼び出す
public class MainCount {
public static void main(String [] args){
//
File[] file =File.listRoots();
for(int i=0;i<file.length;i++){
//
CountFileThread cf = new CountFileThread(file[i].getAbsolutePath());
cf.start();
}
System.out.println(file.length+" ");
}
}
継承インタフェース:
public class RunnableTest implements Runnable{
//
public static void main(String [] args){
for(int t=100;t<1010;t++){
RunnableTest rt = new RunnableTest(t);
Thread thread = new Thread(rt);
thread.start();
}
}
/**
*
*/
public RunnableTest(int id){
this.id = id;
}
@Override
public void run() {
//
while(true){
long currentTime = System.currentTimeMillis();
System.out.println(id+" "+currentTime);
}
}
private int id;
}
匿名の内部クラス
/**
*
*/
ActionListener al = new ActionListener(){
public void actionPerformed(ActionEvent e) {
//
final String command =e.getActionCommand();
/**
*
*/
Thread t= new Thread(){
public void run(){
//
long start=System.currentTimeMillis();
//
if(command.equals(" ")){
jt.setText("");
File fi =(File)jb.getSelectedItem();
int count =Count(fi);
System.out.println(fi.getName()+" "+count);
jt.append("
"+count);
}
//
if(command.equals(" ")){
jt.setText("");
int count =0;
for(int i=0;i<file.length;i++){
count+= Count(file[i]);
System.out.println(file[i].getName()+" "+count);
}
jt.append("
"+count);
}
}
};
t.start();
}
};