一、基本方法

进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是在进程的基础上进行的进一步划分。所谓多线程,是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在、同时运行。

Tread类中的主要方法:

序  号 方法名称 类  型 描  述
1 public Thread(Runnable target) 构造 接收Runnable接口子类对象,实例化Thread对象
2 public Thread(Runnable target, String name) 构造 接收Runnable接口子类对象,实例化Thread对象,并设置线程名称
3 public Thread(String name) 构造 接收Runnable接口子类对象,并设置线程名称
4 public static Thread currentThread() 普通 返回目前正在执行的线程
5 public final String getName() 普通 返回线程的名称
6 public final int getPriority() 普通 返回线程的优先级
7 public boolean isInterrupted() 普通 判断目前线程是否被中断,如果是返回true,否则返回false
8 public final boolean isAlive() 普通 判断线程是否在活动,如果是返回true,否则返回false
9 public final void join() throws Interrupted Exception 普通 等待线程死亡
10 public final synchronized void join(long millis) throws Interrupted Exception 普通 等待millis毫秒后,线程死亡
11 public void run() 普通 执行线程
12  public final void setName(String name) 普通 设定线程名称
13 public final void setPriority(int newPriority ) 普通 设定线程的优先级
14 public static void sleep(long millis) throws InterruptedException 普通 使目前正在执行的线程休眠millis毫秒
15 public void start() 普通 开始执行线程
16 public String toString() 普通 返回代表线程的字符串
17 public static void yield() 普通 将目前正在执行的线程暂停,允许其他的线程执行
18 public final void setDaemon(boolean on) 普通 将一个线程设置成后台运行

二、多线程的实现方式及其异同

方式一:

package test.thread.share.first;

class MyThread extends Thread {
private int ticket = 5;
public void run(){
for(int i = 0; i<10; i++)
if(ticket > 0){
System.out.println("买票: ticket =" + ticket--);
}
}
}
public class ThreadShare { public static void main(String[] args) {
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
MyThread mt3 = new MyThread();
mt1.start();
mt2.start();
mt3.start();
}
}

方式二:

package test.thread.share.second;

class MyThread implements Runnable{
private int ticket = 5;
public void run(){
for(int i=0; i<10; i++){
if(ticket > 0){
System.out.println("买票 ticket = " + ticket--);
}
}
}
}
public class ThreadShare { public static void main(String[] args) {
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
new Thread(new MyThread()).start();
}
}

方式三:

在方式二的基础上略微改动一下。

package test.thread.share.second;

class MyThread implements Runnable{
private int ticket = 5;
public void run(){
for(int i=0; i<10; i++){
if(ticket > 0){
System.out.println("买票 ticket = " + ticket--);
}
}
}
}
public class ThreadShare { public static void main(String[] args) {
// new Thread(new MyThread()).start();
// new Thread(new MyThread()).start();
// new Thread(new MyThread()).start();
MyThread my = new MyThread();
new Thread(my).start();
new Thread(my).start();
new Thread(my).start();
}
}

 方式一与方式二本质上没有什么差别,但是方式三却实现了真正的资源共享,其关键在于Thread类的不同构造方式,new Thread(); 与 new Tread(Runnable target); 这两种方式最终是要调用start()方法,而start()方法是在调用run()方法。因此,关键取决于所调用的run()方法。只有采用new Tread(Runnable target); 这种方式才有可能让传入的参数引用指向同一个run()方法的地址引用,这种机制本质上由于Runnable接口没有定义start()方法,而Thread()构造函数(也可以包含参数)或者说Thread类的内在能力仍然是开辟新的线程任务(引用),一视同仁,至于传入的是什么它不管,只要合法就行,只要最终可以正确的引用到run()方法就Ok了。

三 关于join()

我个人的理解是让当前的线程任务保持join,也就是在一起,不可分割,一次执行完。有点类似于synchronized()的功能,但是synchronized()的参数不能为static object。

public static void main(String[] args) {
MyThread mt = new MyThread();
Thread t = new Thread(mt, "线程");
t.start();
for(int i=0; i<50; i++){
if(i>10){
try{
t.join();
} catch(Exception e){
}
System.out.println("Main 线程运行 ---> " + i);
}
}
}

  上面这段代码中,t线程执行完后,才轮到Main 线程执行,且for循环一次执行完,中间不会穿插着t线程的任务。正常情况下,如果不采用join()方法的话,那么JVM会让t线程与main线程交替随机执行(并行执行)。

四、等待与唤醒

在生产者与消费者模式中会用到同步机制与等待唤醒机制,前者主要针对于局部,而后者更多的是关注整体的布局与策略。二者的配合可以让生产者与消费者模式稳健的运作。

class Info {
private String name = "张三";
private String content = "管理员";
private boolean flag = false; public synchronized void set(String name, String content){
if(!flag){
try{
super.wait();
} catch(InterruptedException ex){
ex.printStackTrace();
}
}
this.setName(name);
try{
Thread.sleep(300);
} catch(InterruptedException ex){
ex.printStackTrace();
}
this.setContent(content);
flag = false;
super.notify();
} public synchronized void get(){
if(flag){
try{
super.wait();
} catch(InterruptedException ex){
ex.printStackTrace();
}
}
try{
Thread.sleep(300);
} catch(InterruptedException ex){
ex.printStackTrace();
}
System.out.println(this.getName() + "-->" + this.getContent());
flag = true;
super.notify();
} public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getContent(){
return content;
}
public void setContent(String content){
this.content = content;
}
}

super.notify()的含义是调用Object类的静态方法notify方法,它会唤醒第一个等待的线程执行,而notifyAll()会唤醒所有的等待线程。wait()方法会让当前执行的线程进入到等待状态,也可以理解为休眠状态。

Java多线程应用总结的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. 使用vue框架运行npm run dev 时报错解决

    使用使用vue框架运行npm run dev 时报错 如下: 原因: localhost:8080 有可能其他软件占用了,导致其他问题的出现 我们可以动态修改地址 解决: 进入项目文件的config文 ...

  2. 将DedeCMS从子目录移动到根目录的方法

    http://www.commonie.com/a/chat/dedeskill/298.html 以前做了一个Wordpress的博客,后来觉得采用DedeCMS更好一点,所以就有了转向DedeCM ...

  3. DedeCMS实现自定义表单提交后发送指定QQ邮箱法

    https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_3_dg&wd=dedecms 邮箱&oq=d ...

  4. C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

    此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html 项目类图: 影院类: using Sy ...

  5. System.Web.Mvc 3.0.0.1 和 3.0.0.0 有什么区别?被 Microsoft ASP.NET MVC 的一次安全更新害惨了!!!

    今天更新站点时,发现网站竟然报错 ... uses 'System.Web.Mvc, Version=3.0.0.1, Culture=neutral, PublicKeyToken=31bf3856 ...

  6. zabbix自动清理30天前的数据

    转:http://www.361way.com/delete-zabbix-histroy-data/3826.html zabbix属于一个细度化的监控工具,其入库数据随着细度的增加相应的入库数据量 ...

  7. 数据存储之HTTP Cookie

    Cookie (HTTP Cookie) 作用 HTTP本身是无状态的,客户端通过Cookie来存储会话信息 限制 cookie在性质上是绑定在特定域名下的 意思是说当设定了一个cookie之后,再给 ...

  8. python3 第十章 - 如何进行进制转化

    在计算机的世界里,2进制是主流,而在人类的自然世界中,10进制是主流,那么在这之间必然就会存在进制转化的问题.本章我们就来谈谈进制转化,也希望通过本章加深您对前些章所学知识的理解. 原理:先说说关于位 ...

  9. Android开发模板代码(一)——简单打开图库选择照片

    首先,先贴上样本代码 //检查权限 public void checkPermission() { if (ContextCompat.checkSelfPermission(this, Manife ...

  10. 根据URL下载图片至客户端、服务器实例

    1.保存至服务器 根据路径保存至项目所在服务器上. String imgUrl="";//图片地址 try { // 构造URL URL url = new URL(imgUrl) ...