java 线程的基本概念_Java 多线程基本概念

进程:是正在运行的程序

线程:是进程中单个顺序控制流,是一条执行路径

创建线程的方法

方式1.继承Thread类

1.定义一个继承Thread的类

2.在该类中重写run()方法

3.在main中创建该类的对象

4.启动线程start //注意:只调用run方法并不会启动线程

d1ccea2a9a1b101f38de6e1df97943a0.png

//JVM:即java虚拟机

87f8f2f90bb004c18dda2f6e12fa0670.png

代码示例:

5d99f67dbee78326d64e3f5ce7637a77.png

f0579cdd5407260fefa2909b05affd13.png

代码示例:

f966c049a181d75371d98ed98f96c48c.png

3de72ea6cdd89a3537ff48c0b0e21c5e.png

补充:

join()方法指让调用该方法的线程强制优先执行完毕直到死亡后其他线程才可继续执行

线程.setDaemon(true)方法里面为true

2d0114b9344a17f2cd43b116cb8a848a.png

补充yield()方法:

13c14588e87ea110798da21e6e81f335.png

线程的生命周期(理解)

81845cfdddd855cf91af9e2e0449789f.png

17d605c0188a212b735bff21d8ba8d49.png

代码示例:

f4f1171bdaf345af8bade1cdfdf489bb.png

//注Runnable接口的一些方法与Thread类并不相同,如getName()的使用形式就不同

fdba8a16788afd24ee24f861a9fff39f.png

25131eeb154d5e964d5e7ef9483fecc3.png

案例:解决多条语句同时操作共享数据导致买票程序出现同一张票被卖多次问题

63b0190e64c4e209a58b131d09029da3.png

0d34636425d54449198810f650c65630.png

1e5a1678368cba2d64becbfead765dda.png

4525108ab46d13c045c82525d37c9a6f.png

利用wait()和notify()函数线程进行交替输出操作:

430115aca2ae0ee5a196878269c7d816.png

//例:使三个线程交替输出“AA”“BB”“CC”

packagestep1;public classTask {public static void main(String[] args) throwsException {/********* Begin *********/

//在这里创建线程, 开启线程

Object a = newObject();

Object b= newObject();

Object c= newObject();

MyThread t1= new MyThread("AA",c,a);

MyThread t2= new MyThread("BB",a,b);

MyThread t3= new MyThread("CC",b,c);

t1.start();

t1.sleep(100);//保证线程按照顺序进行

t2.start();

t2.sleep(100);

t3.start();

t3.sleep(100);/********* End *********/}

}class MyThread extendsThread {/********* Begin *********/String threadName;privateObject prev;//输出顺序的前一个对象privateObject self;//自身的输出对象publicMyThread(String Name,Object prev,Object self) {//TODO Auto-generated constructor stub

threadName=Name;this.prev=prev;this.self=self;

}public voidrun() {int count = 5;while(count > 0){synchronized(prev) {synchronized(self) {

System.out.println("Java Thread" + this.threadName);

count--;

self.notify();

}try{

prev.wait();

}catch(InterruptedException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

System.exit(0);//退出jvm

}/********* End *********/}

d86bff7d22c9c2e573daeced40b508db.png

代码示例:

f92a7e92cba5f30a88ab6b7d8ef38720.png

以此来解决线程安全问题(如多卖票,卖负票的问题)

并发编程的三个概念

在我们进行应用开发的时候,常常会关注网站的并发,如果网站的用户量很多,当这些用户同时访问一个服务的时候,我们的服务器就会接收到大量的并发请求,处理好这些并发请求是一个合格程序员必须要完成的工作。

理解并发编程的三个概念对于我们更好的开发高并发的Web应用有很大的帮助。

1.原子性:即一个操作或者多个操作,要么全部执行并且在执行过程中不会被任何因素打断,要么就不执行。只有简单的读取,赋值(必须是将数字赋值给某个变量,变量之间的赋值不是原子性操作),才是原子性操作。synchronized和lock可以保证在任何时候只有一个线程执行该代码块,所以就保证了原子性。

2.可见性:可见性是当多个线程访问一个变量时,一个线程改变了变量的值,其他线程立马可以知道这个改变。关于保证可见性还可以通过Synchronized和lock的方式来实现。

3.有序性:即程序的执行是按照代码编写的先后顺序执行的。程序可能会发生指令重排序,即处理器为了提升执行效率,会对输入代码进行优化,它不保证代码执行的顺序和代码编写的顺序一致,但是它会保证程序的输出结果和代码的顺序执行结果是一致的。

有序性的例子:

35cc92f7e75b2f2047aa9d1c55711200.png

也就是说,要保证多线程程序执行的正确性,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值