Home  >  Article  >  Java  >  Java thread (anonymous inner class)

Java thread (anonymous inner class)

高洛峰
高洛峰Original
2016-12-15 13:07:391314browse

1 Thread object

Java code

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 Runnable interface

Java code

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();

Which part of the code will be executed below!

Java code

//只要重写了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();

The output results are as follows:

Log code

3: Thread-2  
1: Thread-1  
2: Thread-0  
thread: Thread-3

The following code comes from: JAVA Programming Thoughts 4th Edition, explaining the difference between adding threads or not!
Counter1.java shows the performance of not adding threads !

Java code

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 added threads and the result was quite different. An internal class was added, which inherited Thread

Java code

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 which implemented the Runnable interface

Java code

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);  
    }  
}



For more articles related to Java threads (anonymous internal classes), please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn