您的位置:首页 > 编程语言 > Java开发

java--线程认识与实例记录 NO.1

2013-11-14 15:41 323 查看
下面的内容都是从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) */// :~


截图说明:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: