多线程1
2015-08-04 22:06
197 查看
所谓的进程就是正在执行的程序,而线程就是程序中负责执行程序的执行单元。一个进程中可以有多个执行单元,称之为多线程。一个进程中至少要有一个线程。开启多个线程的目的是为了同时执行多部分代码,每一个线程都有自己要执行的内容,这个内容就叫做 线程需要执行的任务。
多线程的好处:解决了多部分任务同时执行的问题。
多线程的弊端:线程太多,回收效率低。
1、创建线程的两种方式:
(1)继承Thread类
①定义一个类,并继承Thread类
②覆盖Thread类中的run()方法
③直接创建Thread类的子类对象,创建线程
④调用start()方法开启线程并调用线程中的run(),执行线程中的任务
①定义类实现Runnable接口
②覆盖Runnable接口中的run()方法,将线程的任务封装到run()方法中
③通过Thread类创建对象,并将Runnable接口的子类对象作为参数传入到Thread类的构造函数中,因为线程的任务都封装在Runnable子类对象的run方法中,所以在线程创建时就要明确执行的任务是哪一个。
④调用线程对象的start方法进行开启线程
当一个线程在执行操作共享数据的多条代码时,其他线程参与了运算,就会导致安全问题的产生。
解决思路:
将操作共享数据的多条线程代码封装起来,当有线程在执行这些数据时,其他线程不可以参与运算,必须要当前线程将代码执行完毕后,其他线程才可以参与运算。在Java中可以用同步代码块或同步方法来解决。
同步代码块的格式:
synchronized(对象)
{
需要被同步的代码
}
同步的好处:解决了线程的安全问题。
同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。
同步的前提:同步中必须有多个线程并使用同一个锁。
同步方法就是用synchronized修饰的函数,同步方法的锁就是this,而同步代码块的锁可以是任意的对象,同步方法可以看做同部代码块的简写格式。静态同步方法的锁是该类所对应的字节码文件,可以用getClass()方法获取,也可以用类名.class表示。
多线程的好处:解决了多部分任务同时执行的问题。
多线程的弊端:线程太多,回收效率低。
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(); } }
相关文章推荐
- Count the Trees 典型卡特兰数
- 【Objective-C编程】import、include及@Class的孽缘
- VistualStudio 2005 设置PowerBuilder12.5 PBNI编绎命令行。
- 浅谈WebView
- Docker 容器日志的那些事儿
- 【Mac版】安装 Android Studio 及配置环境变量步骤
- 没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)
- 关于foreach的一个BUG
- leetcode面试准备:Count Complete Tree Nodes
- Struts拦截器拦截未登录的操作
- sudo 问题
- 黑马程序员--文件字符输入输出函数的应用
- day04_循环结构_20150804
- 获取鼠标XY坐标
- 例子
- FileInputStream与FileOutputStream练习题 -------------------图片拷贝
- Lua在iOS上的编译
- 选数
- uva10392不要被题目骗了,LL质因数分解
- 如何用python实现剔除列表中相同的元素