【Java】Java中线程的使用
来源:互联网 发布:python多行注释快捷键 编辑:程序博客网 时间:2024/06/07 14:46
摘要:本文讲解了Java中线程的使用,包括线程概念、线程同步、等内容
一、线程概念:
- 有序严谨的指令集称为程序
- 程序的同时多运行称为线程
- 程序中不同的执行路径称为线程
- 多线程编程简单、效率高、易于资源共享
二、线程同步
- 线程同步指的是在一段程序执行过程中,无论成功还是失败,其他线程都会等待该线程执行完毕,才会转入其他线程。这样可以保证程序的完整性和安全性。
三、例子与说明
//实现代码// 此程序用来练习使用线程!//Version:1.0//@Author:Yongchun_zhapackage cha06;//第一种方法创建线程class Xc extends Thread//创建线程所需要继承的类{ public void run()//run方法是覆盖父类的一个方法 { for(int i=0;i<20;i++) { System.out.println("子函数"); } }}public class L6_1{ public static void main(String[] args) { Xc xc=new Xc(); xc.start();//创建一个线程//注:谁调用的start方法,他就会去自动调用run方法;// start会单开启一个线程,而不是直接调用,程序同时往下执行 for(int i=0;i<20;i++) { System.out.println("主函数"); } }}//第二种方法创建线程(推荐方法)class Xc2 implements Runnable//不继承类,而是直接实现接口{ public void run() { for(int i=0;i<20;i++) { System.out.println("子函数"); } }}public class L6_1{ public static void main(String[] args) { Xc2 xc2=new Xc2(); Thread a=new Thread(xc2); a.start(); for(int i=0;i<20;i++) { System.out.println("主函数"); } }}//此程序用来练习使用线程!//Version:1.0//@Author:Yongchun_zhapackage cha06;//第一种方法创建线程class Xc extends Thread//创建线程所需要继承的类{ public void run()//run方法是覆盖父类的一个方法 { for(int i=0;i<20;i++) { System.out.println("子函数"); } }}//练习线程功能:设定线程名称class Xc3 extends Thread{ public void run() { System.out.println(Thread.currentThread()+"is running");//显示当前线程名称 }}public class L6_1{ public static void main(String[] args) { Xc3 xc1=new Xc3(); xc1.setName("线程一"); xc1.start(); Xc3 xc2=new Xc3(); xc2.setName("线程二"); xc2.start(); Xc3 xc3=new Xc3(); xc3.setName("线程三"); xc3.start(); System.out.println(Thread.currentThread()+"is running"); }}//线程练习:设置线程优先级public class L6_1{ public static void main(String[] args) { Thread a1=new Thread(new Xc41()); Thread a2=new Thread(new Xc42()); a1.setPriority(Thread.NORM_PRIORITY+5);//设置线程优先级,默认级别为5,最多为10 a1.start(); a2.start(); }}class Xc41 implements Runnable//不继承类,而是直接实现接口{ public void run() { for(int i=0;i<100;i++) { System.out.println("1线程"+i); } }}class Xc42 implements Runnable//不继承类,而是直接实现接口{ public void run() { for(int i=0;i<100;i++) { System.out.println("第2个线程正在执行"+i); } }}//线程的睡眠//注意:用throws抛异常的时候,如果向主调处抛异常的方法是从父类继承的或者是从接口实现的,//那么,覆盖父类方法或实现接口方法时,如果父类方法中的原方法或接口中的原抽象方法没有抛异常,//则子类覆盖父类的方法或实现接口的方法也不能抛异常。//当出现这种情况时只能用try...catch方法public class L6_1{ public static void main(String[] args) { Thread xc5=new Thread(new Xc5()); xc5.start(); }}class Xc5 implements Runnable//不继承类,而是直接实现接口{ public void run() { for(int i=0;i<10;i++) { System.out.println(Thread.currentThread()+" "+i); try { Thread.sleep(1000);//睡眠1000毫秒 } catch(Exception e) { System.out.println("执行有误!"); } } }}//线程的让步与阻塞public class L6_1{ public static void main(String[] args) { Thread xc61=new Thread(new Xc6()); Thread xc62=new Thread(new Xc6()); xc61.setName("线程一"); xc62.setName("线程二"); xc61.start(); xc62.start(); try { xc61.join();//线程的阻塞 //注:阻塞时将当前线程暂停,直至调用jion函数的线程执行完毕程序才继续往下执行 } catch(Exception e) { } for(int i=0;i<20;i++) { System.out.println("主线程"+i); } }}class Xc6 implements Runnable//不继承类,而是直接实现接口{ public void run() { for(int i=1;i<10;i++) { System.out.println(Thread.currentThread().getName()+": "+i); try { if(i%5==0) { Thread.yield();//线程让步 } } catch(Exception e) { System.out.println("执行有误!"); } } }}
//实例//此程序用来实现一个简易的卖票流程!//Version:1.0//@Author:Yongchun_zhapackage cha06;public class L6_2{ public static void main(String[] args) { Thread xc1=new Thread(new Xc()); Thread xc2=new Thread(new Xc()); xc1.start(); xc2.start(); }}class Xc implements Runnable{ public static int chepiao=100;//注:static的作用是使得两个线程共用一个变量,而非分别使用 public static String aa=new String("1"); public void run() { while(true) { synchronized (aa) //即可以修饰代码块也可以修饰函数,其作用是让其所管辖的内容作为整体执行,当该函数饰函数时,不需要字符串,相当于默认this。 { if(chepiao>0) { System.out.println("第"+Thread.currentThread().getName()+"个车站正在卖第"+(101-chepiao)+"张"); --chepiao; } else { break; } } } }}//此程序用来实现一个简易的生产消费流程!//Version:1.0//@Author:Yongchun_zhapackage cha06;public class L6_3{ public static void main(String[] args) { Ck ck=new Ck(); Shengchan sc=new Shengchan(ck); Xiaofei xf=new Xiaofei(ck); Thread xc1=new Thread(sc); xc1.start(); Thread xc2=new Thread(xf); xc2.start(); }}//仓库类class Ck{ private char rl[]=new char[8]; private int wp=0; public synchronized void shengchan(char aa) { while(wp==rl.length) { try { this.wait(); } catch(Exception e){} } this.notify();//叫醒另一个进程,在当前进程就绪的前提下 rl[wp]=aa; ++wp; System.out.println("生产线正在生产第 "+wp+" 个物品,该物品是: "+aa); } public synchronized void xiaofei() { char aa; while(wp==0) { try { this.wait(); } catch(Exception e){} } this.notify(); aa=rl[wp-1]; System.out.println("消费线程正在消费第 "+wp+" 个产品,该产品是: "+aa); --wp; }}//生产类class Shengchan implements Runnable{ private Ck ck=null; public Shengchan(Ck ck) { this.ck=ck; } public void run() { char aa; for(int i=0;i<26;i++) { aa=(char)('A'+i); ck.shengchan(aa); } }}//消费类class Xiaofei implements Runnable{ private Ck ck=null; public Xiaofei(Ck ck) { this.ck=ck; } public void run() { for(int i=0;i<26;i++) { ck.xiaofei(); } }}
阅读全文
0 0
- Java中线程的使用
- 【Java】Java中线程的使用
- java线程编程中 interrupt 的使用
- Java中线程的介绍和使用
- java中线程的使用(未完)
- Java中线程池的使用
- java中ThreadPoolExecutor线程池的使用
- java 线程中join的使用
- JAVA 中线程队列BlockingQueue的使用
- Java(Android)中线程池的使用
- Java中线程池的使用
- Java中线程池的使用
- Java线程的使用
- java线程的使用
- java线程的使用
- java线程中Exchanger使用
- Java中concurrent包中线程池的使用
- JAVA中常用的4种线程池的使用
- Typeof
- 数组的原生方法的总结
- tomcat问题集锦
- OpenGL学习-VS2013 OpenGL环境配置
- mex -setup 提示找不到SDK或编译器
- 【Java】Java中线程的使用
- Android实现验证码倒计时简单效果
- Lang-String类详解
- Java基础之常见集合的比较
- net.sf.ehcache.ObjectExistsException: Cache shiro-activeSessionCache already exists
- HDU 4686 Arc of Dream
- 2017HDU多校7场
- Web访问原理-从输入URL到页面加载完成的过程中都发生了什么事
- ubuntu下lvm扩容