java基础2
线程浅谈
说起线程就不得不讲讲进程。
以下均是本人自己的理解,如有错误不要见笑
-
程序是一块静态的代码块,他是人为写好的。
-
而进程就是cpu执行程序的动态过程,是资源分配的基本单位。
-
对于线程来说,它不独立占用新的资源。并且一旦执行起来后就不能人为的去操控改变。
-
另外,即使人们没有事先在程序里面写入线程的相关内容,cpu也会把它分为不同的线程,
比如主从线程,gc线程。
线程的执行的三种方法
继承Thread类
具体例子如下:
public class TestThread extends Thread{
public TestThread() {
}
@Override
public void run() {
for (int i = 0; i < 200; i++) {
System.out.println("我在学习多线程===" + i);
}
}
public static void main(String[] args) {
new TestThread().start();
for (int i = 0; i < 300; i++) {
System.out.println("我在读代码===" + i);
}
}
}
具体的执行结果如下:
我在学习多线程===10
我在读代码===1
我在学习多线程===11
我在学习多线程===12
我在读代码===2
我在学习多线程===13
我在学习多线程===14
我在读代码===3
我在学习多线程===15
我在学习多线程===16
我在读代码===4
我在学习多线程===17
我在读代码===5
我在读代码===6
我在学习多线程===18
我在读代码===7
我在读代码===8
上面只是选取的其中一部分结果
还想跟大家分享的就是下面的内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DVWdGHTT-1611542077974)(C:\Users\万年历1\Desktop]Q2TU~{LAY{7SHJYGVY3G7D.png)]
实现Runnable接口
具体程序如下:
public class TestThread1 implements Runnable{
//票数
private int puckit=10;
@Override
public void run() {
while (puckit>0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "得到了第" + puckit-- + "票");
}}
public static void main(String[] args) {
TestThread1 s=new TestThread1();
new Thread(s,"小明").start();
new Thread(s,"老师" ).start();
new Thread(s,"黄牛" ).start();
}
}
线程执行完成后结果如下:
黄牛得到了第10票
小明得到了第9票
老师得到了第9票
老师得到了第8票
小明得到了第8票
黄牛得到了第8票
黄牛得到了第7票
老师得到了第5票
小明得到了第6票
黄牛得到了第4票
小明得到了第3票
老师得到了第2票
黄牛得到了第1票
小明得到了第0票
老师得到了第0票
提醒大家,千万不要写成这样:
new Thread(s,“小明”).run()new Thread(s,“老师”).run()new Thread(s,“黄牛”).run()
另外,该程序的输出结果有一些紊乱,线程执行不安全。
要解决这个问题就要运用到并发的内容了,过会儿再讲
下面再说一个龟兔赛跑的例子:
public class TestThread2 implements Runnable {
private String winner;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (Thread.currentThread().getName().equals("兔子") && i%3==0){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (winner==null)
System.out.println(Thread.currentThread().getName() + "走到了第" + i + "步");
else {
System.out.println("比赛结束"+winner + "赢得了比赛");
break;
}
}
winner=Thread.currentThread().getName();
}
public static void main(String[] args) {
TestThread2 s=new TestThread2();
new Thread(s,"兔子").start();
new Thread(s,"乌龟").start();
}
}
为了模拟兔子睡觉的情况,就让兔子每三步睡1毫秒,结果如下:
兔子走到了第0步
乌龟走到了第0步
乌龟走到了第1步
兔子走到了第1步
兔子走到了第2步
乌龟走到了第2步
乌龟走到了第3步
乌龟走到了第4步
乌龟走到了第5步
乌龟走到了第6步
乌龟走到了第7步
乌龟走到了第8步
乌龟走到了第9步
比赛结束乌龟赢得了比赛
实现Callable接口
同样为了实现火车票订票系统:
import java.util.concurrent.*;
public class TestThread3 implements Callable<Boolean> {
private int puckit=10;
@Override
public Boolean call() throws Exception {
while (puckit>0){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "得到了第" + puckit-- + "票");
}
return null;
}
public static void main(String[] args) {
TestThread3 t1=new TestThread3();
TestThread3 t2=new TestThread3();
TestThread3 t3=new TestThread3();
ExecutorService m= Executors.newFixedThreadPool(3);
Future<Boolean> m1=m.submit(t1);
Future<Boolean> m2=m.submit(t2);
Future<Boolean> m3=m.submit(t3);
try {
boolean mm1= m1.get();
boolean mm2= m2.get();
boolean mm3= m3.get();
} catch (Exception e) {
e.toString();
}
m.shutdownNow();
}
}
注:这里的最后get()会抛出异常,需要处理。
结果如下:
pool-1-thread-3得到了第10票
pool-1-thread-2得到了第10票
pool-1-thread-1得到了第10票
pool-1-thread-2得到了第9票
pool-1-thread-3得到了第9票
pool-1-thread-1得到了第9票
pool-1-thread-3得到了第8票
pool-1-thread-1得到了第8票
pool-1-thread-2得到了第8票
pool-1-thread-3得到了第7票
pool-1-thread-2得到了第7票
pool-1-thread-1得到了第7票
pool-1-thread-3得到了第6票
pool-1-thread-2得到了第6票
pool-1-thread-1得到了第6票
pool-1-thread-1得到了第5票
pool-1-thread-3得到了第5票
pool-1-thread-2得到了第5票
pool-1-thread-3得到了第4票
pool-1-thread-2得到了第4票
pool-1-thread-1得到了第4票
pool-1-thread-3得到了第3票
pool-1-thread-2得到了第3票
pool-1-thread-1得到了第3票
pool-1-thread-1得到了第2票
pool-1-thread-3得到了第2票
pool-1-thread-2得到了第2票
pool-1-thread-3得到了第1票
pool-1-thread-1得到了第1票
pool-1-thread-2得到了第1票
Process finished with exit code 0