【黑马程序员】多线程

来源:互联网 发布:工业企业分行业数据 编辑:程序博客网 时间:2024/05/01 19:47
package cn.itcast3;/* * 线程安全问题:车站卖票 *  * 线程安全问题的出现前提: * 线程随机访问性 * 有多个线程并行 * 多个线程有共享数据 * 多个线程操作了共享数据 *  * 解决办法: * 原子性操作:在执行操作时,我们把一个完整动作可以称为一个原子性操作,是一个不可切割的动作。即不可被线程打断的操作只需要将一个完整的卖票动作看做一个原子性动作即可。java同步关键字:synchronized同步代码块格式:synchronized(锁对象){//该对象可以是任意对象需要同步的代码;}锁对象:几个线程需要使用相同的锁对象进行同步操作,使用不同的锁是无法完成同步操作的。  任意对象都可以当锁。 */public class Demo01_Thread {public static void main(String[] args) {//创建线程执行目标类对象Tickets tickets = new Tickets();//使用线程执行目标类对象创建线程对象Thread t = new Thread(tickets,"粪粪");Thread t2 = new Thread(tickets,"念念");Thread t3 = new Thread(tickets,"青青");//开启线程t.start();t2.start();t3.start();}}


1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在。

2:什么是进程?
 通过任务管理器我们就看到了进程的存在。
 而通过观察,我们发现只有运行的程序才会出现进程。
 进程:就是正在运行的程序。
 进程是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。
 
3:多进程有什么意义呢?
 单进程的计算机只能做一件事情,而我们现在的计算机都可以做多件事情。
 举例:一边玩游戏(游戏进程),一边听音乐(音乐进程)。
 也就是说现在的计算机都是支持多进程的,可以在一个时间段内执行多个任务。
 并且呢,可以提高CPU的使用率。
 
 问题:
  一边玩游戏,一边听音乐是同时进行的吗?
  不是。因为单CPU在某一个时间点上只能做一件事情。
  而我们在玩游戏,或者听音乐的时候,是CPU在做着程序间的高效切换让我们觉得是同时进行的。
  
4:什么是线程呢?
 在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出是一个线程。
 线程:是程序的执行单元,执行路径。是程序使用CPU的最基本单位。
 单线程:如果程序只有一条执行路径。
 多线程:如果程序有多条执行路径。
 
5:多线程有什么意义呢?
 多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
 程序的执行其实都是在抢CPU的资源,CPU的执行权。
 多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多,就会有更高的几率抢到CPU的执行权。
 我们是不敢保证哪一个线程能够在哪个时刻抢到,所以线程的执行有随机性。

package cn.itcast;/* * Thread:线程 是程序中的执行线程 *  * 多线程的实现方法: * 方式一:继承Thread类 * 自定义线程类继承Thread类。 * 重写run方法。run方法内为该线程执行代码。将其理解为其他线程的main方法,即该线程的执行入口。 * 使用: * 创建线程对象 * 开启线程,即调用start方法,该方法会自动调用这个线程的run方法。 */public class Demo01_Thread {public static void main(String[] args) {MyThread mt = new MyThread();MyThread mt2 = new MyThread();MyThread mt3 = new MyThread();//直接调用线程对象的run方法,相当于没有线程,就是一个普通对象的普通方法//mt.run();//mt2.run();//mt3.run();Thread mainThread = Thread.currentThread();mt.start();mt2.start();mt3.start();for (int i = 0; i < 100; i++) {System.out.println(mainThread.getName()+"我是一个线程,我执行了!");}}}


 

1:多线程(理解)(1)如果一个应用程序有多条执行路径,则被称为多线程程序。进程:正在执行的程序。线程:程序的执行路径,执行单元。单线程:如果一个应用程序只有一条执行路径,则被称为单线程程序。多线程:如果一个应用程序有多条执行路径,则被称为多线程程序。举例:迅雷下载,360的管理界面。多线程:多个人吃统一盘菜(2)多线程程序实现的两种方案:(掌握 步骤我们一起写,代码你写)A:继承Thread类a:自定义类MyThread继承Thread类。b:重写run方法(),在这里面输出1-100的数据。c:定义测试类MyThreadTest,在测试类中创建MyThread类的多个对象。d:调用start()代码体现:public class MyThread extends Thread {public MyThread(){}public MyThread(String name) {super(name);}public void run() {for(int x=1; x<=100; x++) {System.out.println(getName()+"---"+x);}}}public class MyThreadTest {public static void main(String[] args) {MyThread my1 = new MyThread("三国志");MyThread my2 = new MyThread("三国杀");//my1.setName("三国志");//my2.setName("三国杀");my1.start();my2.start();}}B:实现Runnable接口a:自定义类MyRunnable实现Runnable接口。b:重写run方法(),在这里面输出1-100的数据。c:定义测试类MyThreadTest,在测试类中创建MyRunnable类的一个对象。d:在测试类创建Thread类的多个对象,并把MyRunnable类的一个对象作为构造参数传递。e:调用start()代码体现:public class MyRunnable implements Runnable {public void run() {for(int x=1; x<=100; x++) {System.out.println(Thread.currentThread().getName()+"---"+x);}}}public class MyRunnableTest {public static void main(String[] args) {MyRunnable my = new MyRunnable();Thread t1 = new Thread(my,"斗地主");Thread t2 = new Thread(my,"三国群英传2");t1.start();t2.start();}}(3)面试题:A:如何启动一个线程B:start()和run()方法的区别C:线程随机性原理D:线程的生命周期E:线程的安全问题是怎么产生的,以及是如何解决的?F:同步解决线程安全问题的方式有几种?G:同步代码块的锁对象是谁?同步方法的锁对象是谁?F:静态方法的锁对象是谁?(4)几个方法优先级(priority)暂停(yield)加入(join)守护线程线程睡眠(sleep)线程中断(interrupt)(5)案例:卖票案例。线程安全问题:怎么产生的:A:多线程环境B:有共享数据C:多条语句操作共享数据怎么解决:把C步骤给锁起来。两种方案:a:同步代码块synchronized(锁对象) {一个原子性操作}b:同步方法把synchronized添加到方法声明上。返回值前。


 

package cn.itcast;import java.io.FileReader;import java.io.IOException;import java.io.Reader;/* * 自定义的读取一行的类 * //一次读取一个字符,当读取到一行末尾时,返回该行内容。//回车换行用来判断一行结束,但是不包含在内容中 */public class MyBufferedReader {//定义Reader类型变量,用来接收一个Reader对象private Reader reader;public MyBufferedReader(Reader reader) {this.reader = reader;}//定义方法,模拟readLine方法功能public String readLine() throws IOException {//定义字符串缓冲区,用来存储一行的内容。StringBuilder sb = new StringBuilder();int c;while((c=reader.read())!=-1) {//如果是\r则不应该存储到字符串中if(c=='\r') continue;//如果是\n则应该将一行的内容直接返回,结束方法调用if(c=='\n') return sb.toString();//如果不是末尾的结束标记,则强转为字符,并添加到缓冲区sb.append((char)c);}//如果读到了文件结尾,缓冲区sb中有内容,说明最后一行有内容,但是没有换行符//此时,直接将最后一行的内容返回if(sb.length()!=0) {return sb.toString();}//如果读取到了文件末尾,并且缓冲区没有内容,就说明没有读到任何内容,返回nullreturn null;}public void close() throws IOException {reader.close();}}


 

0 0
原创粉丝点击