java个人学习笔记16(多线程+extends Thread+implements Runnable)
来源:互联网 发布:workflow软件 编辑:程序博客网 时间:2024/06/13 21:39
1.多线程
进程:正在运行的应用程序在内存中分配的空间
线程:是进程中负责程序执行的执行单元,也称执行路径一个进程中至少有一个线程在负责该进程的运行
多线程技术:解决多部分代码同时执行的需求,合理使用cpu资源,提高用户体验。(微观上串行,并未实际上提高效率)
多线程的运行是根据cpu的切换完成的,具有不确定性。
jvm中的多线程(至少2个):一个负责代码的运行,这个从main方法执行的线程称为主线程。
一个负责垃圾回收(不定时)
每一个线程都有运行代码的内容,称之为线程的任务。线程的任务都封装在特定的区域中。
主线程运行的任务都定义在main方法中
垃圾回收线程(finalize)在收垃圾时会运行finalize()方法。
class Demo{public void finalize(){//垃圾回收方法,即释放资源。不保证该函数一定会被调用System.out.println("demo recycle");}}class FinalizeDemo{public static void main(String[] args) {new Demo();new Demo();new Demo();new Demo();System.gc();//启动垃圾回收器,不一定调用finalize(),由cpu切换造成的不确定性System.out.println("Hello World!");}}
2.创建多线程的两种方法
1)继承Thread类
继承Thread
覆盖run()
创建子类对象就是创建线程对象
调用Thread类中的start(),同时会调用run()
注意:start()开启线程后,都会调用run(),所以run()中存储的都是线程要运行的代码。
调用run()和调用start()的区别:
调用start()会开启线程,并用开启的线程去执行run()方法中的内容
调用run()不会开启线程,执行run()方法中内容的是main线程
class Demo extends Thread{private String name;Demo(String name){this.name = name;}public void show(){for(int i = 1;i <= 10;i++)System.out.println(Thread.currentThread().getName()+"...."+name+"........"+i);}//Thread.currentThread()获取当前运行线程的引用//getName()获取线程的名字public void run(){show();}//覆盖run()}class ThreadDemo{public static void main(String[] args) {Demo d1 = new Demo("Jack");Demo d2 = new Demo("Tom");d1.start();d2.start();for(int i = 1;i <= 10;i++)System.out.println(Thread.currentThread().getName()+"----"+"MainThread"+"......"+i);}}
2)实现Runnable接口
1)定义一个类实现Runnable
2)覆盖Runnable接口中的run方法,将线程要运行的任务代码存储到该方法中
3)通过Thread类创建线程对象,并将实现了Runnable接口的对象作为Thread类的构造函数的参数进行传递
4)调用Thread类的start方法,开启线程
注意:此方法将线程对象和线程任务分开了
实现Runnable接口的好处:
1)避免了继承Thread类的单继承的局限性
2)Runnable接口的出现更符合面向对象,将线程单独进行对象的封装
3)Runnable接口的出现,降低了线程对象和线程任务的耦合性
所以开发多用实现Runnable接口。
多线程的安全问题:
产生原因:
1)线程任务处理到共享数据
2)线程任务中有多条对共享数据的操作
解决思想:
互斥地访问临界资源
解决办法:
同步代码块(未操作共享数据的代码无需同步)
synchronized(object){
需要被同步的代码
}
同步的前提:
多线程在同步中必须使用同一个锁(object)
class SaleTicket implements Runnable{private int tickets = 100;Object obj = new Object();//synchronized(obj),相当于“锁”public void run(){while(true){synchronized(obj){//同步代码块if(tickets > 0){try{Thread.sleep(10);//线程停止执行10ms}catch(InterruptedException e){}System.out.println(Thread.currentThread().getName()+"...."+tickets--);}}}}}class TicketSystem{public static void main(String[] args) {SaleTicket t = new SaleTicket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);Thread t3 = new Thread(t);Thread t4 = new Thread(t);t1.start();t2.start();t3.start();t4.start();}}
- java个人学习笔记16(多线程+extends Thread+implements Runnable)
- Java 多线程:extends Thread Class & implements Runnable Interface
- "implements Runnable"与"extends Thread"
- “implements Runnable” 和“extends Thread”
- Java两种实现多线程方式的比较( implements Runnable 与 extends Thread )
- Java中extends Thread 与 implements Runnable 的区别
- java、android线程extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- extends Thread 与 implements Runnable 的区别
- 010:“implements Runnable” vs. “extends Thread”?
- extends Thread 与 implements Runnable 的区别
- implements Runnable与extends Thread 的区别
- 使用Qt+OpenCV+VideoInput 显示摄像头图像
- COM学习笔记(一)
- warning: incompatible implicit declaration of built-in function
- annotation注解的使用--三
- 手机短号 2081
- java个人学习笔记16(多线程+extends Thread+implements Runnable)
- 模仿微视视频录制、支持按下录制抬起暂停以及断点进度条(基于javacv)
- Design Pattern - 设计模式实战精髓
- 利用HTML5,前端js实现图片压缩
- hdu 1002
- java中可定制的序列化过程 writeObject与readObject
- 字符和数字的转换函数
- 非线性规划 模型与基本概念
- 第四周 项目3 程序的多文件组织