目录:
1.程序
2.进程
3.线程
4.多线程
5.自定义线程类 :
5.1 继承Thread类
public class Demo { public static void main(String[] args) { //此代码为多线程"的程序 System.out.println("Demo类的主线程正在运行。"); //创建两个线程 MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); //启动线程 myThread1.start(); myThread2.start(); System.out.println("Demo的主线程运行结束。"); } } class MyThread extends Thread{ @Override public void run() { System.out.println("线程"+Thread.currentThread().getName()+"的run()方法正在运行。"); } }
5.2 实现Runnable接口
通过继承Thread类有一定局限性,因为Java只支持单继承,一旦继承了某个父类就不能再继承Thread类,这时可通过实现Runnable接口来避免这个问题。
Thead类提供了另一个 构造方法 Thread(Runable target)。Runnable接口中只有一个run( )方法,因此只需传递一个实现Runnable接口的实例对象就能创建线程。
①定义类,实现Runnable接口。
②重写Runnable接口的run( )方法,run()方法的方法体为线程对应的子任务。
③创建自定义类的对象,创建Thread类,Thread类的构造方法的参数为“自定义的对象”。
调用start( )方法。start( )方法的作用:启动线程和调用run( )方法。
public class Demo2 { public static void main(String[] args) { //此代码为多线程的程序 System.out.println("Demo2类的主线程正在运行。"); //创建自定义的实现了Runnable接口的类 MyThread2 obj = new MyThread2(); //创建两个线程,第二个参数为线程指定的名称 Thread t1 = new Thread(obj, "Thread 1 "); Thread t2 = new Thread(obj, "Thread 2 "); //启动线程 t1.start(); t2.start(); System.out.println("Demo2类的主线程运行结束。"); } } class MyThread2 implements Runnable { @Override public void run() { System.out.println("线程"+Thread.currentThread().getName()+"的run()方法正在运行。"); } }
6.多线程的生命周期及状态转换
新建状态 (New)
就绪状态 (Runnable)
运行状态 (Running)
阻塞状态 (Blocked)
死亡状态 (Terminated)
7.多线程的调度
线程的优先级
线程的优先级用1-10之间的整数来表示,数字越大优先级越高。可以用Thread类中的 setPriority(int newPriority) 方法进行设置。优先级高的先运行,优先级低的后运行。
public class Demo3 { public static void main(String[] args) { MaxP max = new MaxP(); MinP min = new MinP(); Thread maxT = new Thread(max, "优先级高的程序"); //设置了优先级,其先执行 Thread minT = new Thread(min, "优先级低的程序"); //其后执行 /** * 正常而言,优先级高的“线程”先执行,优先级低的“线程”后执行。 */ maxT.setPriority(10); //设置优先级 minT.setPriority(1); maxT.start(); minT.start(); System.out.println("主线程结束。"); } } class MaxP implements Runnable { public static void main(String[] args) { System.out.println("主线程正在运行。"); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+": "+i); } } } class MinP implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+": "+i); } } }
线程的休眠
public class Demo4 { public static void main(String[] args) throws InterruptedException { System.out.println("主线程正在运行。"); //创建自定义线程对象 MyThread mt = new MyThread(); //创建线程 Thread thread = new Thread(mt); //启动线程 thread.start(); for (int i = 0; i < 10; i++) { if (i == 5) { //线程休眠,后进入阻塞状态,休眠结束后,重新进入“就绪状态” Thread.sleep(9000); //当i==5时Thead.sleep(),该for循环休眠了9秒 } System.out.println("主线程输出: "+i); } System.out.println("主线程运行结束。"); } } class MyThread implements Runnable { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("MyThread的输出: "+i); } } }
线程的让步
yield() 和 sleep() 的区别
8.多线程同步和通信
8.1 多线程的同步
多线程的并发执行虽然可以提高效率,但是当多个线程去访问同一个资源时,也会引发一些安全问题。
如:线程A读取资源A时,线程B正在修改资源A。那么线程A会读取到/该读取到修改之前的资源A,还是修改后的资源A呢?
(可用多线程的同步来避免此类问题)多线程同步的两种常用方法 :
① 同步代码块 : synchronized(lock) { 操作共享资源代码块 }
② 同步方法 : synchronized 返回值类型 方法名(参数列表)
//同步代码块例子 public class Demo5 { public static void main(String[] args) { //自定义线程对象 SaleTicket sale = new SaleTicket(); //创建四个线程,模拟四个窗口售票 Thread t1 = new Thread(sale, "窗口1"); Thread t2 = new Thread(sale, "窗口2"); Thread t3 = new Thread(sale, "窗口3"); Thread t4 = new Thread(sale, "窗口4"); t1.start(); t2.start(); t3.start(); t4.start(); } } class SaleTicket implements Runnable { int num = 50; @Override public void run() { while (true) { //创建“同步代码块” synchronized ("锁") { if (num > 0) { System.out.println(Thread.currentThread().getName() + "售出了第" + num + "号票。"); num--; } else { System.out.println("票售完了。"); break; } } } } }
public class Demo6 { public static void main(String[] args) { TicketThread2 t = new TicketThread2(); Thread t1 = new Thread(t, "窗口1"); Thread t2 = new Thread(t, "窗口2"); Thread t3 = new Thread(t, "窗口3"); Thread t4 = new Thread(t, "窗口4"); t1.start(); t2.start(); t3.start(); t4.start(); } } class TicketThread2 implements Runnable { //总票数 int num = 50; @Override public void run() { while (true) { //调用售票的方法 sale(); if (num <= 0) { System.out.println("票卖完了。"); break; } } } private synchronized void sale() { //该方法是同步的 if (num > 0) { System.out.println(Thread.currentThread().getName()+"售出了"+num+"号票。"); //获得线程名字等配合其他信息使用 num --; } } }
8.2 多线程通信
原文地址:https://blog.csdn.net/m0_70720417/article/details/134744361
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_26522.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!