1.多个线程共享系统提供给进程的同一块内存地址空间。
2.实现多线程程序的两种方式:
(1)从Thread类继承
(2)实现Runnable接口,实现run()方法。Thread(Runnable target)---Thread(Runnable target,String name)
同样我们也可以使用内部类的方式隐藏实现细节,定义为private.再定义一个getThread()方法获得该内部类的实例,因为一个内部类可以访问外部所有的成员。那么我们同样可以使用这种方式同时启动多个线程访问同一个变量。这样外部类就可以继承别的类或者实现别的接口。应用:例如售票系统。
3.后台线程
JVM会有一个线程执行Main方法。CurrentThread()返回一个static Threan,获取当前的线程。getName()获取线程的名字。定义一个类,继承Thread,执行一段代码,子类要覆盖父类的run()方法,public void 类型的run()方法。在main方法中创建该线程类的实例,调用start()方法。
4.在继承父类Thread的子类中可以自己创建构造方法,传入参数,定义线程的名字。
5.要把某线程类设置成后台线程,可以调用setDaemon()设置成后台线程。true变量设置为后台线程。当一个进程当中,没有非后台线程运行,那么该程序就结束了。yield()使当前线程对象临时暂停,允许别的线程执行,这是一个静态的方法。
6.getPriority(int newPriority),setPriority(int newPriority)得到线程的优先级和设置。MAX_PRIORITY==10,MIN_PRIORITY==1,NORM_PRIORITY==5,三个常量都是一个整数,那么他们的值是,1~10是正常的值。
7.JAVA是抢占式的线程调度模型,有自己的线程调度器。JAVA语言本身不实现相同优先级的时间片轮换,如果JAVA运行所在的系统支持时间片轮换,那么就可以进行时间片轮换。
8.从Thread类继承而来的线程类,在创建该线程类的对象时候,每个对象都有各自的一份拷贝,对访问同一个资源的功能而言,extends Thread不适用。
9.声明一个内部类继承于Thread,则该内部类可以访问外部类的任何成员。我们可以用一个自定义的getNewInstance()方法,获得该内部类的实例。返回return new InnerClassThread();
10.public class SellThread implements Runnable {
int tickets =100;
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"Sell Tickets:"+tickets);
tickets--;
}
}
}
}
public class TicketSystem {
public static void main(String args[]){
SellThread st = new SellThread();//只能声明一个SellThread实例,然后使用该实例创建出四个线程,这四个线程访问的才是同一个共享的变量tickets
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}
11.线程类方法sleep(1000)---让线程休息一会,1000毫秒,就是1秒。
12.线程的同步。可以解决多线程访问同一变量后,出现的问题。
在以上代码中,在run()方法中的代码,我们必须先让一个线程执行完该方法内的if()语句块中的所有代码,我们才让另外一个线程进入该代码块中执行该段代码。
(1)The code segments within a program that access the same object from separate, concurrent threads are called “critical sections”。
在一个程序当中,代码段从单独的并发当中访问了同一个对象,那么该代码段我们称为临界区。【我们就要采用同步的机制对该代码段进行保护】
(2)同步的两种方式:同步块和同步方法
public class SellThread implements Runnable {
int tickets =100;
Object obj = new Object();
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
synchronized(obj){ //判断Obj中个对象的监视器是否被加锁,如果没有被加锁,那么就会将obj加锁,然后往下执行。
//当该代码段被加上锁以后,后面的线程就不可以进入该代码段,知道前一个线程执行完该代码段后,并给该代码段解锁。以此类推
if(tickets>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"Sell Tickets:"+tickets);
tickets--;
}
}
}
}
}
(3)每一个对象都有一个监视器,或者叫做锁
(4)同步方法利用的是this所代表的对象的锁
(5)每个class也有一个锁,是这个class所对应的Class对象的锁
同步静态方法,利用的是该静态方法所在的这个类所对应的监视器。
13.死锁:哲学家进餐问题。
注意suspend()和resume()方法。容易造成死锁。
14.wait(),notify(),notifyAll()管理生产者和消费者问题。
(1)每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的对待队列是空的。wait()方法只能在同步方法当中或者同步块当中被调用。
(2)我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。
(3)当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
(4)当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
(5)wait和notify主要用于producer-consumer这种关系中。
15.线程的状态
stop()-suspend()-该两方法不建议使用。
16.线程的终止
(1)设置一个flag变量。
(2)结合interrupt()方法。
public class TestThread {
public static void main(String[] args){
Thread1 t1 = new Thread1();
t1.start();
int index = 0;
while(true){
if(index++==500){
t1.stopThread(); t1.interrupt(); break;
}
System.out.println(Thread.currentThread().getName());
}
System.out.println("main() exit!");
}
}
class Thread1 extends Thread{
private boolean tsflag = false;
public void run(){
while(!tsflag){
try {
wait();
} catch (Exception e) {
if(tsflag){
return;
} }
System.out.println(getName());
}
}
public void stopThread(){
tsflag = true;
}
}
- 大小: 89.2 KB
分享到:
相关推荐
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
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_多线程...
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
在计算机处理器发展为包含越来越多的核心的时期,多线程是创建可伸缩性、高效的、高响应性应用程序的关键因素。如果你没有正确地使用多线程,它会导致难以捉摸的问题,需要你花费大量时间去解决。因此,现代应用程序...
最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...
Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)...
c语言多进程多线程编程
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
c#大漠多线程模板
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
是多线程的测试,对学习多线程的朋友有用,使用C#2008来编写的,需要的朋友可以去下载
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
excel vba 多线程 实例 excel vba 多线程 实例
简单多线程编程入门,可以帮助你实现第一个多线程程序
最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....