对于一些应用比如Server,需要对并发做出响应,那么需要用到多线程
两种实现多线程的方法:
- 继承 Thread 类
- 实现 Runnable 接口
继承 Thread 类
继承Thread类 必须重写run方法 ,然后调用start
方法,即可执行
实现一个打印数字的线程类
package concurrent;
class printNumThread extends Thread
{
String thname;
printNumThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(int i=0; i<=26; i++) {
System.out.printf("Thread name: %s , print num: %d\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class mutilThread {
public static void main(String[] args) {
printNumThread pt1 = new printNumThread("线程A");
pt1.start();
printNumThread pt2 = new printNumThread("线程B");
pt2.start();
}
}
实现 Runnable 接口
实现Runnable接口,可以重新run,也可以不写,但是值得注意的是直接调用Runnable的run,不会开启多线程,需要在Thread类的构造函数种传入我们实现的Runnable接口的对象,才能开启
错误示范:实现一个打印字母的类,可以看到输出仍然是串行的
package concurrent;
class printCharThread implements Runnable {
String thname;
printCharThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(char i='a'; i<='z'; i++) {
System.out.printf("Thread name: %s , print char: %c\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class mutilThread {
public static void main(String[] args) {
printCharThread pt3 = new printCharThread("线程C");
pt3.run();
printCharThread pt4 = new printCharThread("线程D");
pt4.run();
}
}
正确方法:
在Thread
类构造函数传入实现的Runnable
,调用Thread
类start
方法
package concurrent;
class printCharThread implements Runnable {
String thname;
printCharThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(char i='a'; i<='z'; i++) {
System.out.printf("Thread name: %s , print char: %c\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class mutilThread {
public static void main(String[] args) {
printCharThread run3 = new printCharThread("线程C");
Thread pt3 = new Thread(run3);
pt3.start();
printCharThread run4 = new printCharThread("线程D");
Thread pt4 = new Thread(run4);
pt4.start();
}
}
两种方法:并行
package concurrent;
class printNumThread extends Thread
{
String thname;
printNumThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(int i=0; i<=26; i++) {
System.out.printf("Thread name: %s , print num: %d\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class printCharThread implements Runnable {
String thname;
printCharThread(String threadName) {
this.thname = threadName;
}
public void run() {
for(char i='a'; i<='z'; i++) {
System.out.printf("Thread name: %s , print char: %c\n", thname, i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class mutilThread {
public static void main(String[] args) {
printNumThread pt1 = new printNumThread("线程A");
pt1.start();
printNumThread pt2 = new printNumThread("线程B");
pt2.start();
printCharThread run3 = new printCharThread("线程C");
Thread pt3 = new Thread(run3);
pt3.start();
printCharThread run4 = new printCharThread("线程D");
Thread pt4 = new Thread(run4);
pt4.start();
}
}