1:实现接口来创建线程
话不多说,直接上代码
class Watermelon implements Runnable{
private int num=30;//西瓜的总数
@Override
public void run() {
for (int i = 0; i <30 ; i++) {
if (num>0){
//Thread.currentThread().getName() 返回当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName()+"吃了编号为"+num--+"的西瓜");
}
}
}
}
//实现接口创建线程 人吃西瓜比赛
public class demo02 {
public static void main(String[] args) {
Watermelon w = new Watermelon();
new Thread(w,"科比").start();
new Thread(w,"乔丹").start();
new Thread(w,"欧文").start();
}
}
上结果,不比比(这里由于结果太长,仅展示大部分)
可以看出没有任何的关于线程并发的问题
下面来高潮,我们来让线程睡一下来模拟网络延迟
class Watermelon implements Runnable{
private int num=30;//西瓜的总数
@Override
public void run() {
for (int i = 0; i <30 ; i++) {
if (num>0){
try {
//让线程睡一下,模拟网络延迟
Thread.sleep(10);
//Thread.currentThread().getName() 返回当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName()+"吃了编号为"+num--+"的西瓜");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
//实现接口
public class demo02 {
public static void main(String[] args) {
Watermelon w = new Watermelon();
new Thread(w,"科比").start();
new Thread(w,"乔丹").start();
new Thread(w,"欧文").start();
}
}
上结果
可以看出,乔丹和欧文竟然吃了“鬼瓜”(0和-1)
线程并发问题由此引出,如何解决?
同步代码块方式解决线程并发问题
class Watermelon1 implements Runnable{
private int num=30;//西瓜的总数
@Override
public void run() {
//同步代码块
for (int i = 0; i <30 ; i++) {
synchronized (this){
if (num>0){
//Thread.currentThread().getName() 返回当前正在执行的线程对象的引用
System.out.println(Thread.currentThread().getName()+"吃了编号为"+num+"的西瓜");
try {
//让线程睡一下
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
num++;
}
}
}
}
}
//实现接口
public class demo03 {
public static void main(String[] args) {
Watermelon1 w = new Watermelon1();
new Thread(w,"科比").start();
new Thread(w,"乔丹").start();
new Thread(w,"欧文").start();
}
}
结果看出没有任何线程并发问题(不信自己运行一下)