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

Java thread (anonymous inner class)

高洛峰
Release: 2016-12-15 13:07:39
Original
1337 people have browsed it

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();
Copy after login

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();
Copy after login

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();
Copy after login

The output results are as follows:

Log code

3: Thread-2  
1: Thread-1  
2: Thread-0  
thread: Thread-3
Copy after login

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);  
    }  
}
Copy after login

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);  
    }  
}
Copy after login

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);  
    }  
}
Copy after login



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

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template