今天学习了一下多线程,现在总结一下
首先要理解,程序 ---- 进程------线程 这三者之间的关系。
程序就是我们所执行的“代码”,进程就是正在进行的程序。而线程呢就是在一个进程中的一个执行路径。如果一个进程可以同时进行多个线程,那说明支持多线程。
其实实际上,一个cpu在同一时间只能执行一个线程,而且在多线程时,因为需要各个线程的来回切换,完成的时间要比单线程还要慢。不过即使这样,多线程也有很多优点,比如可以提前计算机的cpu利用率,而且可以增强用户的体验。可以让用户在同一时间进行多种任务。
创建多线程的方式有两种,第一种就是类直接继承Thread类,并重写run()方法,然后创建该类的实例并调用start()方法即可。这种方法有局限性,就是因为java是单继承的。不过有第二种方法,就是实现runnable接口方法,实现里面的run()方法。而启动该线程时,除了创建该类的实例外,还要创建Thread的实例,并把该类的实例作为参数传入Thread的构造器中,调用Thread的实例的start()方法才行。例如:
Class Test implements Runnable{
public void run(){
//这里面写线程执行语句。
}
}
在别的类方法中调用 Test线程时:
Test test = new Test();
Thread th = new Thread(test);
th.start();
这样既可。
然后就是一些多线程的方法,有sleep(),join(),yield()后面还有wait()(暂时没学到)。sleep()和 join() 方法都是对线程的一种阻塞,sleep()方法必须传入参数,指代该线程的睡眠的时间,单位是毫秒。 join()方法可以不传入参数,如果没有参数,代表该线程执行完毕后再执行以下内容。然后对应的有interrupt()方法,这个方法可以直接结束该线程的阻塞状态,直接运行。下面有个例题,方便理解。
代码要求:编写程序,在main方法中创建一个线程。线程每隔一定时间(200ms以内的随机时间)产生一个0-100之间的随机整数,打印后将该整数放到集合中;
共产生100个整数,全部产生后,睡眠30秒,然后将集合内容打印输出;
在main线程中,唤醒上述睡眠的线程,使其尽快打印集合内容。
代码如下。
package com.xiubo.javase.test; public class Test4 { public static void main(String[] args) { InterTest it = new InterTest(); Thread t = new Thread(it); t.start(); while(t.isAlive()){ if(it.id == 5){ t.interrupt(); } } } }
package com.xiubo.javase.test; import java.util.ArrayList; import java.util.List; public class InterTest implements Runnable { int id = 0; int sleepTime = 0; List<Integer> list = new ArrayList<Integer>(); @Override public void run() { for (int i = 0; i < 100; i++) { sleepTime = (int) (Math.random() * 201); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { // e.printStackTrace(); } int num = (int) (Math.random() * 101); System.out.println(num); list.add(num); } id = 5; try { Thread.sleep(30000); } catch (InterruptedException e) { // e.printStackTrace(); } System.out.println(list); } }
然后就是线程同步问题了,线程安全一般是为了防止在访问一些共享数据时,因为同时进入而造成程序的混乱。这就需要一个锁,这个锁的作用就是,在该线程还没有完成对共享数据访问并修改之前,别的线程也无法进入。这样确保了数据的正确性。线程安全问题很重要,比如大家买车票,下面也附上一个代码,方便理解。代码完成的是模拟一个售票系统,同时有三个窗口卖100张票。
package com.xiubo.javase.test; public class Test5 { public static void main(String[] args) { Window w1 = new Window(); Thread t1 = new Thread(w1,"1号窗口"); t1.start(); Thread t2 = new Thread(w1,"2号窗口"); t2.start(); Thread t3 = new Thread(w1,"3号窗口"); t3.start(); } }
package com.xiubo.javase.test; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Window implements Runnable { int ticket = 100; Lock lock = new ReentrantLock(); boolean flag = true; @Override public void run() { while (flag) { try { Thread.sleep(3); } catch (InterruptedException e) { //e.printStackTrace(); } lock.lock(); if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "售票,余票为:" + --ticket); } if(ticket == 0){ flag = false; } lock.unlock(); } } }
好的,今天就到这儿了,感觉多线程还可以,换了个新老师,讲的很快,学的东西很多,很充实,要加油跟上不掉队!
<!--EndFragment-->
相关推荐
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
在计算机处理器发展为包含越来越多的核心的时期,多线程是创建可伸缩性、高效的、高响应性应用程序的关键因素。如果你没有正确地使用多线程,它会导致难以捉摸的问题,需要你花费大量时间去解决。因此,现代应用程序...
最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...
c语言多进程多线程编程
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)...
c#大漠多线程模板
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
是多线程的测试,对学习多线程的朋友有用,使用C#2008来编写的,需要的朋友可以去下载
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
excel vba 多线程 实例 excel vba 多线程 实例
多线程在.net中实现是非常容易的。 VB6本身无法实现多线程编程,但是通过第三方控件,也可以很完美的实现多线程。 本例实现的是在主界面开一个新的线程在后台完成数据查询并根据提供的每页显示的数据行数计算出总...
简单多线程编程入门,可以帮助你实现第一个多线程程序