Java スレッド (匿名内部クラス)

高洛峰
リリース: 2016-12-15 13:07:39
オリジナル
1313 人が閲覧しました

1 スレッドオブジェクト

Java コード

Thread t = new Thread(  
                new Thread(){  
                    @Override  
                    public void run() {  
                      
                        while(true){  
                            try {  
                                Thread.sleep(1000);  
                            } catch (InterruptedException e) {  
                                e.printStackTrace();  
                            }  
                            System.out.println("1: "+Thread.currentThread().getName());  
                            System.out.println("2: "+this.getName());  
                        }                         
                          
                    }  
                }  
        );  
        t.start();
ログイン後にコピー

2 実行可能なインターフェース

Java コード

Thread t2 = new Thread(  
                new Runnable(){  
                    @Override  
                    public void run() {  
                          
                        while(true){  
                            try {  
                                Thread.sleep(1000);  
                            } catch (InterruptedException e) {  
                                e.printStackTrace();  
                            }  
                            System.out.println("3: "+Thread.currentThread().getName());                           
                        }                         
                    }  
                }  
        );  
        t2.start();
ログイン後にコピー

以下でコードのどの部分が実行されますか!

Java コード

//只要重写了run方法,你从构造函数传递进去的线程对象就不会在执行        
        new Thread(new Runnable(){  
              
            @Override  
            public void run() {  
                  
                while(true){  
                    try {  
                        Thread.sleep(1000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    System.out.println("runnable: "+Thread.currentThread().getName());                            
                }                         
            }  
        }  
        ){  
              
            @Override  
            public void run() {  
                  
                while(true){  
                    try {  
                        Thread.sleep(1000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    System.out.println("thread: "+Thread.currentThread().getName());                              
                }  
                  
            }  
        }.start();
ログイン後にコピー

出力結果は次のとおりです:

ログ コード

3: Thread-2  
1: Thread-1  
2: Thread-0  
thread: Thread-3
ログイン後にコピー

次のコードは、JAVA Programming Thoughts 4th Edition からのもので、スレッドを追加するかどうかの違いを説明しています。スレッドを追加しない場合のパフォーマンス !

Java コード

import java.awt.*;  
import java.awt.event.*;  
import java.applet.*;  
  
public class Counter1 extends Applet {    
      
    private static final long serialVersionUID = 1L;  
    private int count = 0;  
    private Button onOff = new Button("Toggle"), start = new Button("Start");  
    private TextField t = new TextField(10);  
    private boolean runFlag = true;  
  
    public void init() {  
        add(t);  
        start.addActionListener(new StartL());  
        add(start);  
        onOff.addActionListener(new OnOffL());  
        add(onOff);  
    }  
  
    @SuppressWarnings("static-access")  
    public void go() {  
        while (true) {  
            try {  
                Thread.currentThread().sleep(100);  
            } catch (InterruptedException e) {  
            }  
            if (runFlag)  
                t.setText(Integer.toString(count++));  
  
        }  
    }  
  
    class StartL implements ActionListener {  
        public void actionPerformed(ActionEvent e) {  
            go();  
        }  
    }  
  
    class OnOffL implements ActionListener {  
        public void actionPerformed(ActionEvent e) {  
            runFlag = !runFlag;  
        }  
    }  
  
    public static void main(String[] args) {  
        Counter1 applet = new Counter1();  
        Frame aFrame = new Frame("Counter1");  
        aFrame.addWindowListener(new WindowAdapter() {  
            public void windowClosing(WindowEvent e) {  
                System.exit(0);  
            }  
        });  
        aFrame.add(applet, BorderLayout.CENTER);  
        aFrame.setSize(300, 200);  
        applet.init();  
        applet.start();  
        aFrame.setVisible(true);  
    }  
}
ログイン後にコピー

Counter2i.java がスレッドを追加すると、Runnable を実装した Thread


Java コード

import java.awt.*;  
import java.awt.event.*;  
import java.applet.*;  
  
public class Counter2i extends Applet {  
      
    private static final long serialVersionUID = 1L;  
  
    private class SeparateSubTask extends Thread {  
        int count = 0;  
        boolean runFlag = true;  
  
        SeparateSubTask() {  
            start();  
        }  
  
        public void run() {  
            while (true) {  
                try {  
                    sleep(100);  
                } catch (InterruptedException e) {  
                }  
                if (runFlag)  
                    t.setText(Integer.toString(count++));  
            }  
        }  
    }  
  
    private SeparateSubTask sp = null;  
    private TextField t = new TextField(10);  
    private Button onOff = new Button("Toggle"), start = new Button("Start");  
  
    public void init() {  
  
        add(t);  
        start.addActionListener(new StartL());  
        add(start);  
        onOff.addActionListener(new OnOffL());  
        add(onOff);  
    }  
  
    class StartL implements ActionListener {  
        public void actionPerformed(ActionEvent e) {  
            if (sp == null)  
                sp = new SeparateSubTask();  
        }  
    }  
  
    class OnOffL implements ActionListener {  
        public void actionPerformed(ActionEvent e) {  
            if (sp != null)  
                sp.runFlag = !sp.runFlag; // invertFlag();  
        }  
    }  
  
    public static void main(String[] args) {  
        Counter2i applet = new Counter2i();  
        Frame aFrame = new Frame("Counter2i");  
        aFrame.addWindowListener(new WindowAdapter() {  
            public void windowClosing(WindowEvent e) {  
                System.exit(0);  
            }  
        });  
        aFrame.add(applet, BorderLayout.CENTER);  
        aFrame.setSize(300, 200);  
        applet.init();  
        applet.start();  
        aFrame.setVisible(true);  
    }  
}
ログイン後にコピー

Counter3.java を継承する内部クラスが追加されました。インターフェイス


Java コード

import java.awt.*;  
import java.awt.event.*;  
import java.applet.*;  
  
public class Counter3 extends Applet implements Runnable {  
      
    private static final long serialVersionUID = 1L;  
    private int count = 0;  
    private boolean runFlag = true;  
    private Thread selfThread = null;  
    private Button onOff = new Button("Toggle"), start = new Button("Start");  
    private TextField t = new TextField(10);  
  
    public void init() {  
        add(t);  
        start.addActionListener(new StartL());  
        add(start);  
        onOff.addActionListener(new OnOffL());  
        add(onOff);  
    }  
  
    @SuppressWarnings("static-access")  
    public void run() {  
        while (true) {  
            try {  
                selfThread.sleep(100);  
            } catch (InterruptedException e) {  
            }  
            if (runFlag)  
                t.setText(Integer.toString(count++));  
        }  
    }  
  
    class StartL implements ActionListener {  
        public void actionPerformed(ActionEvent e) {  
            if (selfThread == null) {  
                selfThread = new Thread(Counter3.this);  
                selfThread.start();  
            }  
        }  
    }  
  
    class OnOffL implements ActionListener {  
        public void actionPerformed(ActionEvent e) {  
            runFlag = !runFlag;  
        }  
    }  
  
    public static void main(String[] args) {  
        Counter3 applet = new Counter3();  
        Frame aFrame = new Frame("Counter3");  
        aFrame.addWindowListener(new WindowAdapter() {  
            public void windowClosing(WindowEvent e) {  
                System.exit(0);  
            }  
        });  
        aFrame.add(applet, BorderLayout.CENTER);  
        aFrame.setSize(300, 200);  
        applet.init();  
        applet.start();  
        aFrame.setVisible(true);  
    }  
}
ログイン後にコピー



Java スレッド (匿名内部クラス) に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート