多线程
1、多线程是指在一个程序中同时执行多个线程,每个线程都有自己独立的执行路径。在多线程中,程序的执行可以同时进行多个任务,从而提高系统的资源利用率和响应性能。
2、多线程的作用:多线程可以更好的利用CPU的资源
3、Java多线程的相关概念:
进程:程序是静态的概念,而进程是动态的概念。每启动一个程序时操作系统就会为其分配一独立的地址空间。 线程:而线程是进程中的一部分,进程包含多个线程在运行。 主线程:Java中如果我们没有启动线程,那么系统会给程序启动一个线程,即主线程,main方法就在主线程运行,程序都是由线程来执行的。
4、线程的状态:
-
创建状态
-
就绪状态
-
运行状态
-
阻塞状态
-
死亡状态
5、多线程并发
Java内置支持多线程编程,多线程程序包含两条或两条以上并发运行的部分,把程序中每个这样的部分都叫作一个线程(thread);每个线程都有独立的执行路径,因此多线程是多任务处理的一种特殊形式。 只要应用程序涉及到并发,就离不开多线程编程 (比如:机票销售系统中会有多个机票代售点)
6、开发多线程的两种方式
(1)继承Thread类,并重写run()方法
(2)实现Runnable接口,并重写run()方法
7、Thread类中的方法
方法 用途 static int enumerate(Thread [ ] t) 将线程所在的线程组及其子组中所有活动的线程复制到指定数组中,返回线程的个数 final String getName() 返回线程的名称 final boolean isAlive() 如果线程是激活的,则返回 true final void setName(String name) 将线程的名称设置为由name指定的名称 final void join( ) throws InterruptedException 等待线程结束
8、继承Thread类实现多线程
package _17多线程; /**继承Thread类实现多线程 * @author Lx * @create 2024-03-13 15:12 */ public class MyThread extends Thread{ public MyThread() { } public MyThread(String name) { super(name);//调用父类中有一个参数的构造方法 } public void run() { for (int i = 1; i < 1000; i++) { if (i%10==0) { try { sleep(1000); //Thread.sleep(1000);//sleep()是静态方法,也可以用类名调用 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(getName()+":"+i); } } }
package _17多线程; /**测试继承Thread类实现多线程 * @author Lx * @create 2024-03-13 15:27 */ public class MyThreadTest { public static void main(String[] args) { MyThread mt1=new MyThread("线程1"); MyThread mt2=new MyThread("线程2"); // mt1.run(); // mt2.run(); mt1.start();//start()可以启动线程,run()只是普通的运行方法 mt2.start();//start()启动线程后,会自动执行run()方法 } }
9、实现Runnable接口实现多线程
package _17多线程; /**实现Runnable接口实现多线程 * @author Lx * @create 2024-03-13 15:36 */ public class MyThread1 implements Runnable{ String name;//此类继承了Object,特有属性需要自己写 public String getName() { return name; } public void setName(String name) { this.name = name; } public MyThread1() { super(); } public MyThread1(String name) { super(); this.name = name; } public void run() { for (int i = 1; i < 1000; i++) { if (i%10==0){ try { //此类继承Object,实现Runnable接口 //需要用Thread类去调用sleep()方法 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(getName()+":"+i); } } }
package _17多线程; /** * @author Lx * @create 2024-03-13 15:48 */ public class MyThread1Test { public static void main(String[] args) { MyThread1 m1=new MyThread1("线程1"); MyThread1 m2=new MyThread1("线程2"); //必须要对线程m1进行再次封装,才能用start()启动 Thread t1=new Thread(m1); Thread t2=new Thread(m2); t1.start(); t2.start(); } }
10、线程优先级
Java中的线程优先级是在Thread类中定义的常量
NORM_PRIORITY:值为5
MAX_PRIORITY:值为10
MIN_PRIORITY:值为1
缺省优先级为NORM_PRIORITY
有关优先级的方法有两个:
final void setPriority(int newp):修改线程的当前优先级
final int getPriority():返回线程的优先级
11、线程同步
有时两个或多个线程可能会试图同时访问一个资源,例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据。在此情况下,数据可能会变得不一致。为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“同步“
12、线程注意事项
不论是通过继承Thread,还是实现Runnable接口创建线程,它们的一个对象只能启动一次。
解决线程同步问题的方法:用synchronized来标识需要同步的代码块。