多线程详解
Posted promiss911
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程详解相关的知识,希望对你有一定的参考价值。
一.多线程的创建与启动
1、继承Thread类:
-
步骤:
①、定义类继承Thread;
②、复写Thread类中的run方法;
目的:将自定义代码存储在run方法,让线程运行
③、调用线程的start方法:
该方法有两步:启动线程,调用run方法。 -
不建议使用:避免OOP单继承局限性
-
实例:
public class TestThread1 extends Thread {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("我在打游戏"+i);
}
}
public static void main(String[] args) {
TestThread1 testThread1 = new TestThread1();
testThread1.start();
for (int i = 0; i < 20; i++) {
System.out.println("我在学习"+i);
}
}
}
2、实现Runnable接口: 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参方法。
-
实现步骤:
①、定义类实现Runnable接口
②、覆盖Runnable接口中的run方法将线程要运行的代码放在该run方法中。
③、通过Thread类建立线程对象。
④、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程执行指定对象的run方法就要先明确run方法所属对象
⑤、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。 -
推荐使用:避免单继承局限性,灵活多变,方便同一对象被多线程使用.
-
实例:
public class TestThread3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("我在打游戏"+i);
}
}
public static void main(String[] args) {
//创建Runnable实现类对象
TestThread3 testThread3 = new TestThread3();
new Thread(testThread3).start();
for (int i = 0; i < 100; i++) {
System.out.println("我在学习"+i);
}
}
}
- 多个线程操作同一资源时,数据出现紊乱:
//多个线程操作同一资源时,数据出现紊乱
public class TestThread4 implements Runnable {
//火车票数
private int ticketNums=15;
@Override
public void run() {
while(true){
if(ticketNums<=0){
break;
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums+"张票");
ticketNums--;
}
}
public static void main(String[] args) {
TestThread4 testThread4 = new TestThread4();
new Thread(testThread4,"我").start();
new Thread(testThread4,"你").start();
new Thread(testThread4,"黄牛").start();
}
}
- 采用龟兔赛跑的例子实现多线程:
public class Race implements Runnable {
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
if(Thread.currentThread().getName().equals("兔子")&&(i%10==0)){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
boolean flag = isOver(i);
if(flag){
break;
}
System.out.println(Thread.currentThread().getName() + "跑了第" + i + "步");
}
}
public boolean isOver(int i) {
if (winner != null) {
return true;
} else if (i == 100) {
winner=Thread.currentThread().getName();
System.out.println(winner + "获得胜利");
return true;
} else
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"乌龟").start();
new Thread(race,"兔子").start();
}
}
3、通过Callable和Future创建线程:
- 实现步骤:
①、创建Callable接口的实现类,并实现call()方法,改方法将作为线程执行体,且具有返回值。
②、创建Callable实现类的实例,使用FutrueTask类进行包装Callable对象,FutureTask对象封装了Callable对象的call()方法的返回值
③、使用FutureTask对象作为Thread对象启动新线程。
④、调用FutureTask对象的get()方法获取子线程执行结束后的返回值。
以上是关于多线程详解的主要内容,如果未能解决你的问题,请参考以下文章