《马士兵J2SE第九章线程个人学习笔记精品资料.doc》由会员分享,可在线阅读,更多相关《马士兵J2SE第九章线程个人学习笔记精品资料.doc(47页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、尚学堂科技_马士兵_JAVA视频教程_J2SE_5.0_第09章_线程 听课笔记 2010-4-2 20:16:34 by LoveXForce第九章 Java多线程机制线程基本概念 Runnable线程类接口线程创建和启动线程的调度好优先级线程的状态控制 sleep join yield 线程同步synchronized wait notify/notifyAll一、 线程基本概 :1进程:一个独立程序的每一次运行称为一个进程。执行进程是指进程里面主线程mian方法开始执行了(静态概念)。机器上运行的都是线程2线程是一个程序不同的执行路径 是一个程序内部的顺序控制流)main方法:一个主线程
2、,主分支3一个时间点上一个CPU只能有一个线程执行进程与线程区别每个进程都有独立的代码和数据空间,进程间的切换会有很大开销。线程可以看成轻量级的进程 同一类线程共享代码和数据空间,每个线程有独立的运行栈个程序计数器,线程切换开销小。多线程:在操作系统中能同时运行多个任务(程序)。多线程:在同一个应用程序中有多个顺序流同时执行。二、 线程的创建和启动1实现Runnable接口(常用,能从其他类基础和实现其他接口)设计一个实现Runable接口的类,根据需要重写run方法;建立该类的对象,以此对象为参数建立Thread类的对象;调用Thread类对象start方法启动线程,将执行权转交到run方法
3、。2继承Thread类(继承比较死,不能从其他类继承)定义一个从Thread类继承的子类并重写其run方法然后生成该类的对象,调用Thread类对象start方法启动线程说明:Runnable接口 java.lang.Runnable Java多线程机制的一个重要部分,实际上它只有一个run()方法 Thread类实现了Runnable接口,相对于Thread类,它更适合于多个线程处理同一资源 实现Runnable接口的类的对象可以用来创建线程,这时start方法启动此线程就会在此线程上运行run()方法 在编写复杂程序时相关的类可能已经继承了某个基类,而Java不支持多继承,在这种情况下,便
4、需要通过实现Runnable接口来生成多线程Thread类 java.lang.Thread 在Java程序中创建多线程的方法之一是继承Thread类 封装了Java程序中一个线程对象需要拥有的属性和方法 从Thread类派生一个子类,并创建这个子类的对象,就可以产生一个新的线程。这个子类应该重写Thread类的run方法,在run方法中写入需要在新线程中执行的语句段。这个子类的对象需要调用start方法来启动,新线程将自动进入run方法。原线程将同时继续往下执行 Thread类直接继承了Object类,并实现了Runnable接口。它位于java.lang包中,因而程序开头不用import任
5、何包就可直接使用例子:ThreadTestThread1.java 开始使用Eclipse1实现Runnable接口(多线程程序交替执行.多态(接口,常用))package Thread;public class TestThread1 public static void main(String args) Runner r = new Runner();Thread t = new Thread(r);/主线程;t.start();/启动分支线程for(int i=0; i100; i+) System.out.println(Main Thread:- + i);class Runner
6、 implements Runnable public void run() /线程运行体;for(int i=0; i100; i+) System.out.println(Runner1 : + i);2 一般程序先执行子线程,再执行主线程(方法调用)package Thread;public class TestThread1_1 public static void main(String args) Runner1 r = new Runner1();r.run();for(int i=0; i100; i+) System.out.println(Main Thread:- + i
7、);class Runner1 implements Runnable public void run() for(int i=0; i100; i+) System.out.println(Runner1 : + i);3继承Thread类(继承,不常用)package Thread;public class TestThread1_2public static void main(String arg)Runner1_2 r = new Runner1_2();r.start();for (int i = 0 ;i = 100; i+)System.out.println(Main Thr
8、ead:!+i);class Runner1_2 extends Threadpublic void run()for (int i = 0 ;i = 100; i+)System.out.println(Runner2:!+i);2010-4-2 21:04:16 2010-4-14 16:28:59三、 线程状态转换FromJava Web开发详解四、 线程控制基本方法Sleep/Join/Yield方法 Sleep/Join(需要捕获异常)例子1 Thread/TestInterrupt.Java (线程结束的方式)package Thread;import java.util.*;pu
9、blic class TestInterrupt public static void main(String arg)MyThread thread = new MyThread();thread.start();tryThread.sleep(10000);/主线程睡眠catch(InterruptedException e)thread.interrupt();/中断线程。class MyThread extends Threadboolean flag = true;public void run()/重写的方法不能抛出不必被重写方法不同的方法,此处不能写throws Interrup
10、tedExceptionwhile(flag)System.out.println(-+ new Date()+-);trysleep(1000);catch(InterruptedException e)/捕获抛出的异常return;/停止例子2 Thread/ TestJoin.Java (线程合并方式)package Thread;public class TestJoin public static void main(String args) MyThread2 t1 = new MyThread2(abcde); t1.start();/启动分支线程 try t1.join();/
11、把T1分支线程合并到当前线程 catch (InterruptedException e) for(int i=1;i=10;i+) System.out.println(i am main thread); class MyThread2 extends Thread MyThread2(String s) super(s); public void run() for(int i =1;i=10;i+) System.out.println(i am +getName(); try sleep(1000); catch (InterruptedException e) return; 例子
12、3 Thread/ TestYield.Java (让出Cup)package Thread;public class TestYield public static void main(String args) MyThread3 t1 = new MyThread3(t1); MyThread3 t2 = new MyThread3(t2); t1.start(); t2.start(); class MyThread3 extends Thread MyThread3(String s)super(s); public void run() for(int i =1;i=100;i+)
13、System.out.println(getName()+: +i); if(i%10=0) yield(); 五、 线程优先级 Priority例子 Thread/ TestPriority.Javapackage Thread;public class TestPriority public static void main(String args) Thread t1 = new Thread(new T1();Thread t2 = new Thread(new T2();t1.setPriority(Thread.NORM_PRIORITY + 3);/提高优先级t1.start()
14、;t2.start();class T1 implements Runnable public void run() for(int i=0; i1000; i+) System.out.println(T1: + i);class T2 implements Runnable public void run() for(int i=0; i1000; i+) System.out.println(-T2: + i);2010年4月14日21:40:41 2010-4-15 16:23:44六、 例子 TestThread2-6TestThread2一个线程类可以启动两个线程package T
15、hread;public class TestThread2 /一个线程类可以启动两个线程public static void main(String args) Runner2 r = new Runner2();Thread t1 = new Thread(r);Thread t2 = new Thread(r);t1.start();t2.start();class Runner2 implements Runnable public void run() for(int i=0; i30; i+) System.out.println(No. + i);正常停止线程TestThread
16、4package Thread;public class TestThread4 /怎么正常停止线程public static void main(String args)Runner4 r = new Runner4(); Thread t = new Thread(r); t.start(); for(int i=0;i0) System.out.println(in thread main i= + i); System.out.println(Thread main is over); r.shutDown(); /t.stop(); class Runner4 implements
17、Runnable private boolean flag=true; public void run() int i = 0;while (flag=true) System.out.print( + i+); public void shutDown() flag = false; TestThread6 isAlivepackage Thread;public class TestThread6 public static void main(String args)Thread t = new Runner6(); t.start();for(int i=0; i50; i+) Sys
18、tem.out.println(MainThread: + i); class Runner6 extends Thread public void run() System.out.println(Thread.currentThread().isAlive();for(int i=0;i50;i+) System.out.println(SubThread: + i);七、 线程同步引入:两人同时取同一账户的钱两个线程访问同一资源,进程之间协调的问题解决:在进程访问独占资源时先锁定再访问 synchronized 最好只锁定一个对象加锁过程中:一个方法做了同步(加锁)另一个方法没有做同步,
19、别的线程可以访问没做同步的方法,并且能影响已经同步的方法,要保护需要的同步的对象,必须对要访问的对象所有方法要仔细考虑加不加同步,加同步效率变低,不加同步有可能产生数据不一致的后果读写两方法,写的方法加锁。两个方法都改了同一个值,两个方法都应该加同步TsetSync.javapackage Thread;public class TestSync implements Runnable Timer timer = new Timer(); public static void main(String args) TestSync test = new TestSync(); Thread t1
20、 = new Thread(test); Thread t2 = new Thread(test); t1.setName(t1); t2.setName(t2); t1.start(); t2.start(); public void run() timer.add(Thread.currentThread().getName();/拿到当前线程的名字 class Timer private static int num = 0; public void add(String name) /public synchronized void add(String name) /synchron
21、ized 锁定关键字 /synchronized (this) /锁定 num +; try Thread.sleep(1); /让线程睡眠,给另一个线程执行的机会,更容易看到xia catch (InterruptedException e) System.out.println(name+, 你是第+num+个使用timer的线程); / t2, 你是第2个使用timer的线程t1, 你是第2个使用timer的线程堆内存:test对象testtimertimer对象t1t2问题出现在线程执行方法时被另一个线程打断了.执行:num +;.System.out.println(name+, 你
22、是第+num+个使用timer的线程);两句话时被另个进程打断死锁 07_线程同步_3.aviThread/TestDeadLock.java两个线程锁定了互斥的对象package Thread;/一个线程类模拟两个线程。用flag区分public class TestDeadLock implements Runnable public int flag = 1;static Object o1 = new Object(), o2 = new Object();public void run() System.out.println(flag= + flag);if(flag = 1) s
23、ynchronized(o1) /锁定o1try Thread.sleep(500); catch (Exception e) e.printStackTrace();synchronized(o2) /锁定o2System.out.println(1);if(flag = 0) synchronized(o2) /锁定o2try Thread.sleep(500); catch (Exception e) e.printStackTrace();synchronized(o1) /锁定o1System.out.println(0);public static void main(String
24、 args) TestDeadLock td1 = new TestDeadLock();TestDeadLock td2 = new TestDeadLock();td1.flag = 1;td2.flag = 0;Thread t1 = new Thread(td1);Thread t2 = new Thread(td2);t1.start();t2.start();一道面试题:08_线程同步_4.Avi.当m1()方法执行的过程中,另外的线程能执行m2()package Thread;public class TT implements Runnable int b = 100;publ
25、ic synchronized void m1() throws Exceptionb = 1000;Thread.sleep(5000);System.out.println(b = + b);public void m2() System.out.println(b);public void run() try m1(); catch(Exception e) e.printStackTrace();public static void main(String args) throws Exception TT tt = new TT();Thread t = new Thread(tt)
26、;t.start();Thread.sleep(1000);tt.m2();结果:1000b = 1000八、 生产者消费者问题 11_线程同步_7_生产者消费者问题.avi XXX.wait() 让当前访问这个线程等待,此时这个线程的锁不存在了XXXX.notify() 唤醒在此对象监视器上等待的单个线程。一个wait()对应一个notify()package Thread;public class ProducerConsumer public static void main(String args) SyncStack ss = new SyncStack();Producer p =
27、 new Producer(ss);Consumer c = new Consumer(ss);new Thread(p).start();new Thread(p).start();new Thread(p).start();new Thread(c).start();class WoTou int id; WoTou(int id) this.id = id;public String toString() return WoTou : + id;class SyncStack int index = 0;WoTou arrWT = new WoTou6;public synchroniz
28、ed void push(WoTou wt) while(index = arrWT.length) try this.wait(); catch (InterruptedException e) e.printStackTrace();this.notifyAll();/ 唤醒arrWTindex = wt;index +;public synchronized WoTou pop() while(index = 0) try this.wait(); catch (InterruptedException e) e.printStackTrace();this.notifyAll();in
29、dex-;return arrWTindex;class Producer implements Runnable SyncStack ss = null;Producer(SyncStack ss) this.ss = ss;public void run() for(int i=0; i20; i+) WoTou wt = new WoTou(i);ss.push(wt);System.out.println(生产了: + wt);try Thread.sleep(int)(Math.random() * 200); catch (InterruptedException e) e.pri
30、ntStackTrace();class Consumer implements Runnable SyncStack ss = null;Consumer(SyncStack ss) this.ss = ss;public void run() for(int i=0; iREFACTER-RENAME 一改全改ALT+ENTER 查看现在项目的位置 Alt+ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+ 当前行和上面一行交互位置(同上) Ctrl+W 关闭当前Editer C+/ 注释(取消注释)选中行C+S+/ 注释多行C+S+取消注释 F2 查看完整的函数帮
31、助信息,并且可以复制粘贴文字 ,当选中文件时,有改名作用 F3找到变量的定义 C+鼠标点击 找到变量的定义 作用和F3C差不多。 F4找到接口方法的具体实现类.=C+T F5刷新 C+F6:在打开的文件间进行切换; C+F7:在资源窗口间进行切换; C+F8:在各种模式间进行切换; C+E:选择某个打开的文件; C+S+r:打开一个文件; c+s+t:打开一个类; c+s+f:格式化代码; C+S+O:导入需要的类 c+o:查看类结构; c+t:列出子类或接口实现类(类的等级结构) Ctrl+Alt+ 复制当前行到下一行(复制增加) Ctrl+Alt+ 复制当前行到上一行(复制增加) Ctrl
32、K (加SHIFT是向上)向下查找选中的字符串 Ctrlshift 向上向下查找一个函数和变量 Java基础知识1.Java是Sun公司的JamesGosling发明的面向对象的可跨平台的编程语言。2.SUN公司,Stanford University Network,斯坦福大学;3.平台:我们把cpu处理器与操作系统的整体叫做平台。不同的操作系统支持不同的cpu指令集。不同的cup有不同的指令集,如intel和AMD.4.JDK:Java Software Develop Kit. JVM:Java Virtual Machine.Java虚拟机,包含:类加载器,字节码校验器,java解释器
33、。 JRE:java运行时环境,包含jvm与java运行支持类库。5.环境变量:java_home;classpath:.;C:Javajdk1.6.0_10lib;path6.jdkjdk1.1为jvm增加了JIT(即时编译)编译器;jdk1.2也叫java2;jdk1.5也叫java5(改动较大);现在使用的是jdk1.6。7.jdk,Java Developent ToolKit;开发java需要有源程序文件到中间文件的编译器;运行java中间文件需要对应平台的解释器(官方叫法JVM);编译器、解释器加上一些其它的组件合称为JDK.JDK的另外一个称呼为Java Software dev
34、elop kit.JDK即开发java程序的组件。jdk=java编译器+jre(java运行环境) jre=jvm+运行支持类库 eclipse和jbuilder本身自带了java编译器但不包含jre。8.jre:Java Runtime Environment,java运行时需要的环境。有两类,开发需要的jre和公共jre。9.jdk版本,jdk1.2到jdk1.4为java2时代,java技术有j2ee,j2se,jeme.jdk1.5,也叫做java5,技术术语改为javase,javaee,javame.1.5在1.4的基础上改动很大。10.常用的DOS命令:dir,现实当前文件夹的
35、所有文件;cd . 打开上级目录;exit:退出。11.java注释:java注释分为三种单行注释,多行注释,文档注释,文档注释结果为:/*换行*/,文档注释在帮助文档里面有显示。12.javadoc帮助文档,javadoc可执行程序可生成帮助文档,用法如下:javadoc Test01.java13.java 打包jar,用法见cmd输入jar;ant也是一种打包成jar的工具,其功能叫jar更加强大;除了jar包外,java文件包还有war,ear两种格式。14.java缺点:运行速度慢,占用资源多是java的缺点;其原因是:class需要二次编译,解释执行;jvm运行占用资源;无指针无法
36、直接操作内存,垃圾回收线程占用资源,并且不会实时收集内存。15.JVM,JAVA虚拟机即java解释器;JVM执行.class文件需要三步:类加载器加载;校验器检查错误,执行文件。在执行的时候有两种方法:a.解释器直接执行;b.JIT代码生成器搞定。16.两种解释执行方法的区别:直接解释执行是1.1版本的,其直接翻译class文件,速度必然比机器执行二进制文件的速度慢;1.2版本后引入JIT,即将class文件先转换为二进制文件,再执行二进制文件,下次执行时可直接执行二进制文件。15.JIT(即时编译):java即时编译技术,可执行java代码的运行速度。17.IDE工具 IDE:Integr
37、ated Development Environment,集成开发环境。18.开发java的IDE工具:JCREATOR,JBUILDER,ECLIPSE,NETBEANS.20.拷贝项目的三种方式:a.拷贝整个工作空间,切换工作空间。b.拷贝项目,导入项目。c.只拷贝源代码(即src文件夹),从新建的项目导入。22.转义字符:单引号:;双引号:;反斜杠:;回车:n;水平制表符:t;换行:r. 转义字符一般出现在字符串中时,要是以原型输入,则输出一定报错,只有以转换后的才能显示。23.数据类型转换:byte char short int long float double,String,小杯到
38、大杯自动转换,但是大杯到小杯强制转换。一般的格式:标变量=(目标类型)源变量,特殊的,String转换为其它,int a = Integer.parseInt(str1);float b = Float.parseFloat(str2);boolean c = Boolean.parseBoolean(str3);24.内存分配 基本数据类型只在栈中分配内存;应用数据类型不仅在栈中分配内存,还在堆中分配内存,在变量声明时,在栈中分配内存,当创建对象时,在堆中分配内存。25.值传递和引用传递 本人去见网友叫按引用传递;替身去见网友叫做按值传递。引用传递参数数值改变,按值传递参数值不变。基本数据类
39、型就是按值传递的,又称为值类型,而引用类型是按引用传递的。String 虽然是按引用传递的,但是传递给的新变量会有属于自己的堆内存,所以,String值不变。包: 开发中最好在导入包和类的过程中,最好是使用哪个类就导入那个类,不要导入包。27.包的命名规则:反写的企业域名.功能名.模块名28.系统包(SUN提供的包)默认包-java.lang.常用包 java.lang: java的核心类库,包含了运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包 java.lang.reflect:提供用于反射对象的工具 java.io: java语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出等 java.util:常用的工具类,如集合框架类,日期处理类等。主题:旺旺老师软件