马士兵J2SE第九章线程个人学习笔记精品资料.doc
《马士兵J2SE第九章线程个人学习笔记精品资料.doc》由会员分享,可在线阅读,更多相关《马士兵J2SE第九章线程个人学习笔记精品资料.doc(47页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 马士兵J2SE第九章线程个人学习笔记 精品资料 士兵 J2SE 第九 线程 个人 学习 笔记 精品 资料
限制150内