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

时间:2023-03-09 19:17:51
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) */// :~

截图说明:

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