ホームページ >Java >&#&チュートリアル >Java スレッド (匿名内部クラス)
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 からのもので、スレッドを追加するかどうかの違いを説明しています。スレッドを追加しない場合のパフォーマンス !
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
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 を継承する内部クラスが追加されました。インターフェイス
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); } }