多线程
进程
程序的一次运行就是一次进程,进程里面有多个线程组成
线程
开启线程
对象.start();
通过thread来开启线程举例
package base.duoxiancheng.Demo01;
public class Test extends Thread{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("这是run的"+i);
}
}
public static void main(String[] args) {
Test t1=new Test();
t1.start();
for (int i = 0; i < 2000; i++) {
System.out.println("这是主线程的"+i);
}
}
}
因此运行结果 中 run中主线程中
因此说明两种线程同时进行~
实现Runnable接口实现
package base.duoxiancheng.Demo02;
import base.duoxiancheng.Demo01.Test;
public class TestTread2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("这是run的"+i);
}
}
public static void main(String[] args) {
TestTread2 t1 = new TestTread2();
Thread thread=new Thread(t1);
thread.start();
//或者 new Thread(t1).start(); 匿名对象进行调用
for (int i = 0; i < 2000; i++) {
System.out.println("这是主线程的"+i);
}
}}
//运行结果
这是主线程的109
这是主线程的110
这是run的72
这是run的73
这是run的74
这是run的75
这是run的76
这是run的77
这是主线程的111
这是run的78
启动线程
传入目标对象+thread对象.start()
runnable接口能够避免单继承的局限性,方便一个接口与多个线程使用
多线程
下面一个例子解释多线程的(模拟买票系统)
package base.duoxiancheng.Demo03;
//发现问题,多个线程操作同个资源的时候,会有重复现象,不安全,线程紊乱
public class TestTread3 implements Runnable{
private int ticeknum=10;
@Override
public void run() {
while (true) {
if (ticeknum <= 0)
break;
try {
Thread.sleep(200);//加了线程延时
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticeknum-- + "票");//获取线程的名字
}
}
public static void main(String[] args) {
TestTread3 testTread3=new TestTread3();
new Thread(testTread3,"小明").start();
new Thread(testTread3,"小红").start();
new Thread(testTread3,"黄牛党").start();
}
}
运行结果为
小红拿到了第9票
黄牛党拿到了第10票
小明拿到了第10票
黄牛党拿到了第6票
小明拿到了第7票
小红拿到了第8票
小明拿到了第5票
小红拿到了第5票
黄牛党拿到了第5票
小红拿到了第4票
黄牛党拿到了第4票
小明拿到了第3票
黄牛党拿到了第2票
小红拿到了第1票
小明拿到了第1票
下面解决票数重复问题
龟兔赛跑案例
package base.duoxiancheng.Demo04;
public class race implements Runnable{
@Override
public void run() {
boolean r=true;
if (Thread.currentThread().getName().equals("兔子"));
{
try {
Thread.sleep(200);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
for (int i = 0; i <=100 ; i++) {
if(!(r=gameover(i))){
break;
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
}
}
public boolean gameover(int step){
if (step>100)
return false;
else
return true;
}
public static void main(String[] args) {
race race=new race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}