盛年不重来,一日难再晨,及时当勉励,岁月不待人。这篇文章主要讲述Java中的线程相关的知识,希望能为你提供帮助。
目录
??线程??
??一个线程的生命周期??
??线程的创建与启动??
??线程的终止??
??线程的同步机制??
??线程的通知机制??
线程一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
一个线程的生命周期
线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
下图显示了一个线程完整的生命周期。
线程的创建与启动
java 提供了三种创建线程的方法:
方法一:实现Runnable接口
这是因为 java 不允许多重继承,如果你的类已经继承于别的类,又要作为线程来运行,则可以使用这种方式
public class Hello implementsRunnable
public void run()
//填写要干的事
Hello obj=new Hello();
Thread t=new Thread(obj);
t.start();
//线程的启动
方法二:
继承 Thread 类
public class Helloextends Thread
public voidrun()
//填写要干的事
new Hello().start;
//线程的启动
方法三:通过 Callable 和 Future 创建线程
创建线程的三种方式的对比:
线程的终止
当一个线程的start()调用后,线程为Alive状态。当一个线程的主函数run()退出后,线程死亡(Dead);
想让一个线程终止,就是要想办法让它从run()中退出来。当一个线程在sleep的时候,必须使用t.interrupt()来中断目标线程才可以使线程退出。等待线程的退出t.join();
//线程的终止
public class Test1 extends Thread
public boolean quitflag=false;
public void run()
for(int i=0;
i<
10;
i++)
if(quitflag)
break;
System.out.println("---------");
try
Thread.sleep(1000);
catch (InterruptedException e)
e.printStackTrace();
public class Hello
public static void main(String[] args)
// TODO 自动生成的方法存根
Test1 t1=new Test1();
t1.start();
//接受用户输入 输入后终止线程
InputStreamReader m=new InputStreamReader(System.in);
BufferedReader read=new BufferedReader(m);
try
read.readLine();
read.close();
t1.quitflag=true;
//线程终止
t1.interrupt();
//使正在sleep的线程终止
t1.join();
//等待线程退出
catch (Exception e)
// TODO 自动生成的 catch 块
e.printStackTrace();
System.out.println("结束了");
线程的同步机制
当两个或多个线程同时访问一个对象时,可能发生数据不同步的现象。为了实现多线程对同一对象的同步访问,引入互斥锁的概念。
synchronized(lock)//申请锁
//关键代码
线程的通知机制
wait/notify 通知机制
public class Test1
static boolean flag=true;
static Object lock=new Object();
public static void main(String[] args)
One a=new One();
a.start();
Two b=new Two();
b.start();
static class One extends Thread
public void run()
synchronized(lock)
while(flag)
try
System.out.println("flag is true");
lock.wait();
//线程等待,释放锁
catch (InterruptedException e)
e.printStackTrace();
System.out.println("结束");
static class Two extends Thread
public void run()
synchronized (lock)
System.out.println("flag is false");
flag=false;
lock.notify();
System.out.println("notify之后,不会立即退出!");
【Java中的线程】
推荐阅读
- 驱动实现强制重启与关机操作
- Java中的结构语句
- Java中的接口
- ADB调试工具的使用
- java|ES中解决模糊搜索的时候搜索一个中文可以,两个以上中文就不行的情况
- 网络安全|网络安全——信息隐藏-使用隐写术来防止敏感数据被盗用
- 笔记|使用es实现个人博客的模糊搜索,搜索推荐
- 不好意思, Maven 该换了!
- 中间件|千万不要这样使用@Async注解