java中的线程
分类:
文章
•
2024-09-18 19:48:58
线程
一、多线程的概念
是指程序包含两条或者两条以上并发运行的部分,程序中每个这样的部分都叫一个线程(thread)每个线程都有独立的执行路径。因此多线程是多任务处理的一种特殊形式。
优点:在于取消了主循环|轮询机制。一个线程可以暂停而不影响程序其他部分。
二、线程分为四种状态
1、new(新生)
2、Runnable(可运行)
3、Blocked(被阻塞)
4、Dead(死亡)
⑴新生:当线程被创建的时候,线程还没开始运行,此时线程处在新生的状态。当一个线程处在新生状态时候,程序还没开始运行线程中的代码。
⑵可运行线程:
当线程调用Start()方法时,该线程九可以运行了
⑶被阻塞线程:
在线程运行的中可能因为一些原因而进入被阻塞状态。
①线程通过调用sleep()方法进入睡眠状态
②线程调用了一个在IO上被阻塞的操作,在这个操作完成之前不会返回它的调用者,也就是这个方法不会return.
③线程在等待某个特定的触发条件
⑷死亡线程
有两个原因会导致线程死亡
①因为run方法正常退出而导致线程死亡
②因为一个未被捕获的异常终止了当前线程的正常运行
四、创建线程(一)
主线程:当java运用启动时,一个线程立刻运行,该线程通常叫做程序主线程。它是程序开始时候执行的。重要性体现在两个方面
1、它是产生其他子线程的线程
2、通常它必须最后完成执行,因为它执行各种关闭动作
五、创建线程(二)
创建线程,java定义了两种方式
1实现Runnable接口
创建了实现Runnable接口类以后,需要在测试类内部实例化一个Thread类对象,调用start()方法才能启动线程。
Eg:public class TH02 implements Runnable{
@Override
public void run() {
for(int i=0;i<20;i++){
System.out.println("第"+i+"个人");
}
}
}
测试类代码
Public static void main(String[]args){
Runnable fu=new TH02();
Thread mj=new Thread(fu);
mj.start();
}
2继承Thread类
继承Thread类,需要重写run方法,必须调用start方法启用线程。

Eg:
public class TH01 extends Thread {
public void run(){
for(int i=0;i<20;i++){
System.out.println("第"+i+"个小狗");
}
}
}
测试类
public static void main(String[] args) {
TH01 fr=new TH01();
fr.start();
String na=fr.getName();
System.out.println(na);
System.out.println(fr.getPriority());
}
五、线程同步
概念:当两个或者两个以上的线程共享资源,他们需要某种方法来确定在某一时刻,仅被一个线程占用,这种方法称为同步。(synchronization)。
使用方法:用关键字synchronized修饰,可以直接修饰需同步的方法,也可以在调用出修饰调用的代码块。
eg:两个窗口一共售火车票10张,旅客自愿选择窗口一还是窗口二买票。
代码:
1、实现线程
public class Buytraintickets implements Runnable {
private String Buyplace;
private int num=10;
@Override
public synchronized void run() {
if(num>0){
num--;
System.out.println(Thread.currentThread().getName()+"买1张票"+"还剩"+num+"张票");
}
}
public Buytraintickets(String buyplace) {
super();
Buyplace = buyplace;
}
public String getBuyplace() {
return Buyplace;
}
测试类:
public class Test01 {
public static void main(String[] args) {
Buytraintickets fr= new Buytraintickets ("null");
for(int i=0;i<10;i++){
Thread th1=new Thread(fr,"窗口一");
th1.start();
Thread th2=new Thread(fr,"窗口二");
th2.start();
}
}
}