java中的线程、进程、锁
来源:互联网 发布:机加工成本计算软件 编辑:程序博客网 时间:2024/06/08 11:32
加了synchronized就是代表这个是锁,保证每次只能有一个线程访问这个代码,防止多线程并发,出现获取数据错误。当我们运行一个项目进程时会有多个线程启动。一个函数可能由多个线程会来访问,获取其中的公共资源,就是并发,假如一个函数里面有公共资源b=12;线程A把b改为10,而同时线程B来获取数据时,不知道自己的数据被改了,就获取到修改后的数据。这当然不是我们想要的。将函数加一个锁就可以每次只让一个线程来来访问,其他的都是等待
public static synchronized String genUniqueKey() {
Random random = new Random(); int num = random.nextInt(900000) + 100000; return System.currentTimeMillis() + String.valueOf(num); }如果查看JAVA源代码的时候有native关键字时,就代表是java底层c语言
1.单线程:程序中只存在一个线程,实际主方法就是一个主线程
2.多线程:在一个程序中运行多个任务
3.线程的实现:
1)继承Thread类:必须重写run()方法,等待CPU进行调度
2)实现Runnable接口
4线程的状态
1)创建状态:建立一个多线程对象
2)就绪状态:调用start()方法
3)运行状态:执行run()方法
4)阻塞状态:暂停执行进即将资源给其他线程使用
5)终止状态(死亡状态):线程销毁
5线程的常用方法
1)取得线程的名字:getName();
2)取得当前线程对象:currentThread()
3)判断线程是否启动:isAlive()
4)线程的强行运行:join()
5)线程更的休眠:sleep();
class RunnableDemo implements Runnable{ private String name; public RunnableDemo(String name){ this.name=name; } public void run(){ for(int i=0;i<50;i++){ // System.out.println("A"+Thread.currentThread().getName()); try{ Thread.sleep(1000);//一秒执行一次 } catch(InterruptedException e){ e.printStackTrace(); } System.out.println(name+":"+i); } } } public class Operation { public static void main(String args[]){RunnableDemo r=new RunnableDemo("A");// RunnableDemo r1=new RunnableDemo("A");Thread t=new Thread(r);// Thread t1=new Thread(r1);//第二个线程创建于第一个线程并发执行// t1.start();t.start();//线程就绪状态/* for(int i=0;i<50;i++){if(i>10){//当主线程执行10次try{t.join();//强制让自己的线程执行,之后执行余下的主线程}catch(InterruptedException e){e.printStackTrace();}}System.out.println("主线程:"+i);} */ } }线程的礼让
class RunnableDemo implements Runnable{ private String name; public RunnableDemo(String name){ this.name=name; } public void run(){ for(int i=0;i<50;i++){ System.out.println(name+":"+i); if(i==10){ //当A执行10次时,执行B十次 System.out.println("礼让"); Thread.yield(); } } } } public class Operation { public static void main(String args[]){RunnableDemo r=new RunnableDemo("A");RunnableDemo r1=new RunnableDemo("B");Thread t=new Thread(r);Thread t1=new Thread(r1);t.start();t1.start();//线程就绪状态 } }
6线程的优先级
class ThRun implements Runnable{public void run(){for(int i=0;i<5;i++){try{Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+":"+i);}catch(InterruptedException e){e.printStackTrace();}}} } public class Operation { public static void main(String args[]){Thread t1=new Thread(new ThRun(),"A");Thread t2=new Thread(new ThRun(),"B");Thread t3=new Thread(new ThRun(),"C");t1.setPriority(Thread.MIN_PRIORITY);t2.setPriority(Thread.NORM_PRIORITY);t3.setPriority(Thread.MAX_PRIORITY);//不一定它大,就先执行,只是优先抢CPUt1.start();t2.start();//线程就绪状态t3.start(); } }7 线程同步
有五张票,同时由三个窗口来买,卖票的等待时间一秒。
class ThRun implements Runnable{private int ticket=5;public void run(){for(int i=0;i<10;i++){if(ticket>0){try{Thread.sleep(1000);System.out.println("车票:"+ticket--);}catch(InterruptedException e){e.printStackTrace();}}}} } public class Operation { public static void main(String args[]){ThRun m=new ThRun();Thread t1=new Thread(m);Thread t2=new Thread(m);Thread t3=new Thread(m);t1.start();t2.start();//线程就绪状态t3.start(); } }
上图出现了负数,证明五张车票没有做到资源共享,就需要用到同步,下面是同步代码块,同步方法就只要在方法类型前面加synchronized
class ThRun implements Runnable{private int ticket=5;public void run(){for(int i=0;i<10;i++){synchronized (this){if(ticket>0){try{Thread.sleep(1000);System.out.println("车票:"+ticket--);}catch(InterruptedException e){e.printStackTrace();}}}}} } public class Operation { public static void main(String args[]){ThRun m=new ThRun();Thread t1=new Thread(m);Thread t2=new Thread(m);Thread t3=new Thread(m);t1.start();t2.start();//线程就绪状态t3.start(); } }
8线程的生命周期
锁就是例如:大学毕业要高薪水,企业要经验,形成死锁。
阅读全文
0 0
- java中的线程、进程、锁
- Java 中的进程与线程
- Java 中的进程与线程
- Java 中的进程与线程
- Java 中的进程与线程
- java中的进程与线程
- JAVA中的进程与线程
- java中的进程和线程
- Java中的进程and线程
- java中的进程和线程
- Java 中的进程与线程
- JAVA中的进程和线程
- java中的进程,线程,线程池总结
- java中的进程,线程,线程池总结
- 【java基础】Java 中的进程与线程
- [Java] Java 中的进程与线程
- Java中的线程和进程比较
- java中的线程与进程的区别
- 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
- angularJS 路由不能正常工作 URL中出现#!
- 归并排序
- 心情随笔
- 正则表达式小结
- java中的线程、进程、锁
- tomcat 优化
- echo框架使用:获取与配置
- ubuntu 下PyCharm下如何使用flask创建pythonproject
- [绍棠] IQKeyboardManager的使用
- 如何查看linux分区类型
- Codeforces 846 D Monitor(类似求面积的前缀和)
- 设计模式--观察者模式(二)
- [LeetCode] 3Sum