多线程1
来源:互联网 发布:清宫表虚岁准确算法 编辑:程序博客网 时间:2024/06/06 10:43
所谓的进程就是正在执行的程序,而线程就是程序中负责执行程序的执行单元。一个进程中可以有多个执行单元,称之为多线程。一个进程中至少要有一个线程。开启多个线程的目的是为了同时执行多部分代码,每一个线程都有自己要执行的内容,这个内容就叫做 线程需要执行的任务。
多线程的好处:解决了多部分任务同时执行的问题。
多线程的弊端:线程太多,回收效率低。
1、创建线程的两种方式:
(1)继承Thread类
①定义一个类,并继承Thread类
②覆盖Thread类中的run()方法
③直接创建Thread类的子类对象,创建线程
④调用start()方法开启线程并调用线程中的run(),执行线程中的任务
class Demo extends Thread{Demo(String name){super(name);}public void run(){for(int x=0; x<10; x++){System.out.println("x="+x+"...name="+Thread.currentThread().getName());}}}class ThreadDemo1{public static void main(String[] args) {Demo d1 = new Demo("旺财");Demo d2 = new Demo("xiaoqiang");d1.start();d2.start();System.out.println("over...."+Thread.currentThread().getName());}}(2)实现Runnable接口
①定义类实现Runnable接口
②覆盖Runnable接口中的run()方法,将线程的任务封装到run()方法中
③通过Thread类创建对象,并将Runnable接口的子类对象作为参数传入到Thread类的构造函数中,因为线程的任务都封装在Runnable子类对象的run方法中,所以在线程创建时就要明确执行的任务是哪一个。
④调用线程对象的start方法进行开启线程
class Demo implements Runnable{public void run(){show();}void show(){for(int x=0; x<9; x++){System.out.println("x="+x+"...name="+Thread.currentThread().getName());}}}class ThreadDemo2 {public static void main(String[] args) {Demo d = new Demo();Thread t1 = new Thread(d);Thread t2 = new Thread(d);t1.start();t2.start();}}2、同步代码块和同步方法
当一个线程在执行操作共享数据的多条代码时,其他线程参与了运算,就会导致安全问题的产生。
解决思路:
将操作共享数据的多条线程代码封装起来,当有线程在执行这些数据时,其他线程不可以参与运算,必须要当前线程将代码执行完毕后,其他线程才可以参与运算。在Java中可以用同步代码块或同步方法来解决。
同步代码块的格式:
synchronized(对象)
{
需要被同步的代码
}
同步的好处:解决了线程的安全问题。
同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。
同步的前提:同步中必须有多个线程并使用同一个锁。
同步方法就是用synchronized修饰的函数,同步方法的锁就是this,而同步代码块的锁可以是任意的对象,同步方法可以看做同部代码块的简写格式。静态同步方法的锁是该类所对应的字节码文件,可以用getClass()方法获取,也可以用类名.class表示。
class Bank{private int sum;public synchronized void add(int num){sum = sum +num;try{Thread.sleep(10);}catch(InterruptedException e){}System.out.println("sum="+sum+"...name="+Thread.currentThread().getName());}}class Cus implements Runnable{private Bank b = new Bank();public void run(){for(int x=0; x<3; x++){b.add(100);}}}class ThreadDemo3 {public static void main(String[] args) {Cus c = new Cus();Thread t1 = new Thread(c);Thread t2 = new Thread(c);t1.start();t2.start();}}
- 多线程(1
- 多线程---- 1
- 多线程1
- 多线程1
- 多线程1
- 多线程1
- 多线程-1
- 多线程1
- 多线程1
- 多线程1
- 多线程(1)
- 多线程1
- 多线程1
- 多线程1
- 多线程 1
- 多线程-1
- 多线程 1
- 多线程1
- HDU 5344
- 剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列
- Android复习笔记(10) -对话框的使用
- HDU 5351 MZL's Border
- HDU 2546 饭卡
- 多线程1
- UVa 567 Risk (Floyd+任意两点最短路)
- C语言编程入门——综合练习(三)学生管理系统
- 正则表达式30分钟入门教程
- JAVA学习笔记(一)
- Oracle 11g R2+RAC+ASM+redhat安装详解1
- SVN 版本控制
- zoj 2100Seeding
- Android ApiDemos示例解析(68):Graphics->MeasureText