zoukankan      html  css  js  c++  java
  • java--线程认识与实例记录 NO.1

    下面的内容都是从java编程思想一书中摘取出来,我认为很有产考价值,并且便于后续使用。

    主要内容是记录继承thread和实现runnable接口两种方式的代码用法,及内部类中启用线程的用法。


    1、首先看下一个继承Thread类的用法,通过第13行代码,在构造方法中通过start开启线程。

    然后程序执行SimpleThread类的run方法。

    package concurrency;
    
    //: concurrency/SimpleThread.java
    // Inheriting directly from the Thread class.
    
    public class SimpleThread extends Thread {
    	private int countDown = 5;
    	private static int threadCount = 0;
    
    	public SimpleThread() {
    		// Store the thread name:
    		super(Integer.toString(++threadCount));
    		start();
    	}
    
    	public String toString() {
    		return "#" + getName() + "(" + countDown + "), ";
    	}
    
    	public void run() {
    		while (true) {
    			System.out.print(this);
    			if (--countDown == 0)
    				return;
    		}
    	}
    
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++)
    			new SimpleThread();
    	}
    } 
    


    2、下面是一个实现Runnable接口的实例方法:

    通过对比两个程序的用法上大致相同,区别在于实现接口的类可以再继承其他的类。

    package concurrency;
    
    //: concurrency/SelfManaged.java
    // A Runnable containing its own driver Thread.
    
    public class SelfManaged implements Runnable {
    	private int countDown = 5;
    	private Thread t = new Thread(this);
    
    	public SelfManaged() {
    		t.start();
    	}
    
    	public String toString() {
    		return Thread.currentThread().getName() + "(" + countDown + "), ";
    	}
    
    	public void run() {
    		while (true) {
    			System.out.print(this);
    			if (--countDown == 0)
    				return;
    		}
    	}
    
    	public static void main(String[] args) {
    		for (int i = 0; i < 5; i++)
    			new SelfManaged();
    	}
    }


    3、基于继承thread和实现runnable接口的内部类,实现方式:

    package concurrency;
    
    //: concurrency/ThreadVariations.java
    // Creating threads with inner classes.
    import java.util.concurrent.*;
    import static net.mindview.util.Print.*;
    
    // Using a named inner class:
    class InnerThread1 {
    	private int countDown = 5;
    	private Inner inner;
    
    	private class Inner extends Thread {
    		Inner(String name) {
    			super(name);
    			start();
    		}
    
    		public void run() {
    			try {
    				while (true) {
    					print(this);
    					if (--countDown == 0)
    						return;
    					sleep(10);
    				}
    			} catch (InterruptedException e) {
    				print("interrupted");
    			}
    		}
    
    		public String toString() {
    			return getName() + ": " + countDown;
    		}
    	}
    
    	public InnerThread1(String name) {
    		inner = new Inner(name);
    	}
    }
    
    // Using an anonymous inner class:
    class InnerThread2 {
    	private int countDown = 5;
    	private Thread t;
    
    	public InnerThread2(String name) {
    		t = new Thread(name) {
    			public void run() {
    				try {
    					while (true) {
    						print(this);
    						if (--countDown == 0)
    							return;
    						sleep(10);
    					}
    				} catch (InterruptedException e) {
    					print("sleep() interrupted");
    				}
    			}
    
    			public String toString() {
    				return getName() + ": " + countDown;
    			}
    		};
    		t.start();
    	}
    }
    
    // Using a named Runnable implementation:
    class InnerRunnable1 {
    	private int countDown = 5;
    	private Inner inner;
    
    	private class Inner implements Runnable {
    		Thread t;
    
    		Inner(String name) {
    			t = new Thread(this, name);
    			t.start();
    		}
    
    		public void run() {
    			try {
    				while (true) {
    					print(this);
    					if (--countDown == 0)
    						return;
    					TimeUnit.MILLISECONDS.sleep(10);
    				}
    			} catch (InterruptedException e) {
    				print("sleep() interrupted");
    			}
    		}
    
    		public String toString() {
    			return t.getName() + ": " + countDown;
    		}
    	}
    
    	public InnerRunnable1(String name) {
    		inner = new Inner(name);
    	}
    }
    
    // Using an anonymous Runnable implementation:
    class InnerRunnable2 {
    	private int countDown = 5;
    	private Thread t;
    
    	public InnerRunnable2(String name) {
    		t = new Thread(new Runnable() {
    			public void run() {
    				try {
    					while (true) {
    						print(this);
    						if (--countDown == 0)
    							return;
    						TimeUnit.MILLISECONDS.sleep(10);
    					}
    				} catch (InterruptedException e) {
    					print("sleep() interrupted");
    				}
    			}
    
    			public String toString() {
    				return Thread.currentThread().getName() + ": " + countDown;
    			}
    		}, name);
    		t.start();
    	}
    }
    
    // A separate method to run some code as a task:
    class ThreadMethod {
    	private int countDown = 5;
    	private Thread t;
    	private String name;
    
    	public ThreadMethod(String name) {
    		this.name = name;
    	}
    
    	public void runTask() {
    		if (t == null) {
    			t = new Thread(name) {
    				public void run() {
    					try {
    						while (true) {
    							print(this);
    							if (--countDown == 0)
    								return;
    							sleep(10);
    						}
    					} catch (InterruptedException e) {
    						print("sleep() interrupted");
    					}
    				}
    
    				public String toString() {
    					return getName() + ": " + countDown;
    				}
    			};
    			t.start();
    		}
    	}
    }
    
    public class ThreadVariations {
    	public static void main(String[] args) {
    		new InnerThread1("InnerThread1");
    		new InnerThread2("InnerThread2");
    		new InnerRunnable1("InnerRunnable1");
    		new InnerRunnable2("InnerRunnable2");
    		new ThreadMethod("ThreadMethod").runTask();
    	}
    } /* (Execute to see output) */// :~
    


    截图说明:






  • 相关阅读:
    一个Netfilter nf_conntrack流表查找的优化-为conntrack添加一个per cpu cache
    【翻译自mos文章】检查$ORACLE_HOME是否是RAC的HOME的方法以及relink RAC的Oracle binary的方法
    DVBS/S2在数字电视系统中的应用 三 (LNB介绍)
    cache数据库之表的存储结构
    jsp网页在浏览器中不显示图片_eclipse环境下配置tomcat中jsp项目的虚拟路径
    彻底搞懂oracle的标量子查询
    OpenCV学习教程入门篇&lt;一、介绍&gt;
    NYOJ 38 布线问题_(解法1 Kruskal算法)
    HTML5之WebSocket && https://zhuanlan.zhihu.com/p/23467317
    HTML5离线缓存
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3423901.html
Copyright © 2011-2022 走看看