package Demo032;<br><br>/**<br> * @Author: H-YONG-8<br> * @DATA: 2023/4/20<br> * JavaSE<br> * 创建多线程 继承Thread类<br> */<br>public class TestThread1 extends Thread{<br> @Override<br> public void run() {<br> for (int i = 0; i < 20; i++) {<br> System.out.println("我在看代码-----"+i);<br> }<br> }<br><br> public static void main(String[] args) {<br> //main 主线程<br><br> //创建一个线程对象<br> TestThread1 testThread1 = new TestThread1();<br><br> //调用start()方法开启线程<br> testThread1.start();<br> for (int i = 0; i < 20; i++) {<br> System.out.println("我在学习多线程---"+i);<br> }<br> }<br>}<br><br>//多条执行路径,主线程和子线程并行交替执行<br><br>执行结果:<br>我在学习多线程---0<br>我在看代码-----0<br>我在学习多线程---1<br>我在看代码-----1<br>我在学习多线程---2<br>我在看代码-----2<br>我在看代码-----3<br>我在学习多线程---3<br>我在看代码-----4<br>我在看代码-----5<br>我在学习多线程---4<br>我在学习多线程---5<br>我在看代码-----6<br>我在学习多线程---6<br>我在看代码-----7<br>我在学习多线程---7<br>我在看代码-----8<br>我在学习多线程---8<br>我在看代码-----9<br>我在学习多线程---9<br>我在看代码-----10<br>我在学习多线程---10<br>我在学习多线程---11<br>我在学习多线程---12<br>我在学习多线程---13<br>我在学习多线程---14<br>我在学习多线程---15<br>我在学习多线程---16<br>我在学习多线程---17<br>我在学习多线程---18<br>我在学习多线程---19<br>我在看代码-----11<br>我在看代码-----12<br>我在看代码-----13<br>我在看代码-----14<br>我在看代码-----15<br>我在看代码-----16<br>我在看代码-----17<br>我在看代码-----18<br>我在看代码-----19
复制代码
8.2.2 Runnable
创建一个线程是声明实现类Runnable接口
定义MyRunable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
注意:
启动线程:传入目标对象+Thread对象.start()
推荐使用,避免单继承局限性,灵活方便,方便同一个对象被多个线程使用。
实例:
package Demo032;<br><br>/**<br> * @Author: H-YONG-8<br> * @DATA: 2023/4/20<br> * JavaSE<br> * 实现Runnable接口线程<br> */<br>public class TestThread2 implements Runnable{<br> <br> //重写方法<br> @Override<br> public void run() {<br> for (int i = 0; i < 20; i++) {<br> System.out.println("我在看代码-----"+i);<br> }<br> }<br><br> public static void main(String[] args) {<br> //main 主线程<br><br> //创建一个线程对象<br> TestThread2 testThread2 = new TestThread2();<br> //代理,通过线程对象来开启线程<br> Thread thread = new Thread(testThread2);<br> thread.start();<br> for (int i = 0; i < 20; i++) {<br> System.out.println("我在学习多线程---"+i);<br> }<br> }<br>}<br><br><br><br>执行结果:<br>我在学习多线程---0<br>我在学习多线程---1<br>我在看代码-----0<br>我在学习多线程---2<br>我在看代码-----1<br>我在学习多线程---3<br>我在看代码-----2<br>我在学习多线程---4<br>我在学习多线程---5<br>我在学习多线程---6<br>我在看代码-----3<br>我在学习多线程---7<br>我在学习多线程---8<br>我在学习多线程---9<br>我在学习多线程---10<br>我在学习多线程---11<br>我在学习多线程---12<br>我在学习多线程---13<br>我在学习多线程---14<br>我在学习多线程---15<br>我在学习多线程---16<br>我在学习多线程---17<br>我在学习多线程---18<br>我在看代码-----4<br>我在学习多线程---19<br>我在看代码-----5<br>我在看代码-----6<br>我在看代码-----7<br>我在看代码-----8<br>我在看代码-----9<br>我在看代码-----10<br>我在看代码-----11<br>我在看代码-----12<br>我在看代码-----13<br>我在看代码-----14<br>我在看代码-----15<br>我在看代码-----16<br>我在看代码-----17<br>我在看代码-----18<br>我在看代码-----19
复制代码
案例:
package Demo032;<br><br>/**<br> * @Author: H-YONG-8<br> * @DATA: 2023/4/20<br> * JavaSE<br> *多个线程同时操作同一个对象<br> * 买火车票的例子<br> */<br>public class TestThread4 implements Runnable{<br><br> private int a = 10;<br><br> @Override<br> public void run() {<br> while (true){<br> if (a<=0){<br> break;<br> }<br> System.out.println(Thread.currentThread().getName()+"拿到了"+a--+"票");<br> }<br><br> }<br><br> public static void main(String[] args) {<br> TestThread4 b = new TestThread4();<br> new Thread(b,"小明").start();<br> new Thread(b,"老师").start();<br> new Thread(b,"黄牛").start();<br> new Thread(b,"警察").start();<br> }<br>}<br><br>执行结果:<br>小明拿到了9票<br>老师拿到了8票<br>警察拿到了7票<br>黄牛拿到了10票<br>警察拿到了4票<br>警察拿到了2票<br>警察拿到了1票<br>老师拿到了5票<br>小明拿到了6票<br>黄牛拿到了3票<br>
复制代码
8.2.3 实现Callable接口
实现Callable接口,需要返回值类型
重写call方法,需要抛出异常
创建目标对象
创建执行服务:ExecutorService ser =Executors.newFixedThreadPool(1);
并发编程,从程序设计的角度来说,是希望通过某些机制让计算机可以在一个时间段内,执行多个任务。从计算机 CPU 硬件层面来说,是一个或多个物理 CPU 在多个程序之间多路复用,提高对计算机资源的利用率。从调度算法角度来说,当任务数量多于 CPU 的核数时,并发编程能够通过操作系统的任务调度算法,实现多个任务一起执行。