1:继承thread和实现Runnable创建线程的区别:
 继承thread创建的对象直接start()就可以就绪,但是使用Runnable所new出来的对象要先new Thread(xx)才能start()
 这也就意味着在start()之前实现Runnable的类一次new 出来的对象是可以多次传入new Thread()创建多个线程实例并且多次start()的,就是说
 runnable的数据可以被共享,但是继承thread创建的线程不具备这个功能。

class Thread1 extends Thread{
private int count=;
private String name;
public Thread1(String name) {
this.name=name;
}
public void run() {
for (int i = ; i < ; i++) {
System.out.println(name + "运行 count= " + count--);
try {
sleep((int) Math.random() * );
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
} public class Main { public static void main(String[] args) {
Thread1 mTh1=new Thread1("A");
Thread1 mTh2=new Thread1("B");
mTh1.start();
mTh2.start(); } }

2:线程的状态:

           |-阻塞- |
| |
就绪-可运行-运行中-死亡
| / |
| / |
锁------等待

运行---可运行:thread.yield()
运行--等待:object.wait()
运行--阻塞:thread.sleep() thread.join()
运行--锁:synchronized
等待--锁:object.notify() 或者wait时间到
锁--可运行:

3:解析sleep() wait() yield()的区别:

                sleep                        wait                      yield
所属类: Thread Object Thread
目的: 运行到阻塞 运行到等待    运行到可运行或者立即重新运行
锁持有状态: 不释放 释放     释放
让出cpu资源后: 允许比自己优先级低的运行      只允许比自己优先级高或等的执行,也可能自己去执行
使用条件: 任何地方   必须在同步块或者方法中

4:常用方法
   sleep(): 强迫一个线程睡眠N毫秒。
  isAlive(): 判断一个线程是否存活。
  join(): 等待线程终止。
  activeCount(): 程序中活跃的线程数。
  enumerate(): 枚举程序中的线程。
    currentThread(): 得到当前线程。
  isDaemon(): 一个线程是否为守护线程。
  setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
  setName(): 为线程设置一个名称。
  wait(): 强迫一个线程等待。
  notify(): 通知一个线程继续运行。
  setPriority(): 设置一个线程的优先级。

5:synchronized

a:    Public synchronized void methodAAA()//修饰静态方法时锁对象是调用这个方法的对象
{ //…. }
b:public void method3(SomeObject so)//修饰块时锁对象是括号中的对象
{
synchronized(so)
{
//…..
}
}
c: Class Foo{
public synchronized static void methodAAA() // 同步的static 函数锁对象是当前类
{
}
public void methodBBB() { synchronized(Foo.class) // 等同于上面 } }

6:经典例子

public class Test {
public class myThread implements Runnable{
private String threadName;
private Object pre;
private Object curr;
public myThread(String n,Object p,Object c){
this.threadName=n;
this.pre=p;
this.curr=c;
}
public void run() {
// TODO Auto-generated method stub
int i=;
while (i>){
synchronized(pre){
synchronized(curr){
System.out.println(threadName);
i--;
curr.notify();//通知下一个对象获得锁
}
try {
pre.wait();
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//释放对pre对象持有的锁
}
}
}
}
public static void main(String[] args){
Object a=new Object();
Object b=new Object();
Object c=new Object();
Test t=new Test();
myThread pa=t.new myThread("A",c,a);
new Thread(pa).start();
myThread pb=t.new myThread("B",a,b);
new Thread(pb).start();
myThread pc=t.new myThread("C",b,c);
new Thread(pc).start();
}
}

java多线程注意事项的更多相关文章

  1. Java多线程初学者指南系列教程

    转自:http://developer.51cto.com/art/200911/162925.htm 51cto 本系列来自NokiaGuy的“真的有外星人吗”博客,系列名称为<Java多线程 ...

  2. 细说Java多线程之内存可见性

    编程这些实践的知识技能,每一次学习使用可能都会有新的认识 一.细说Java多线程之内存可见性(数据挣用)         1.共享变量在线程间的可见性                共享变量:如果一个 ...

  3. Java多线程编程核心技术

    Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...

  4. Java多线程编程核心技术(三)多线程通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  5. Java多线程的同步控制记录

    Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...

  6. JAVA多线程基础学习二:synchronized

    本篇主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题,没错就是使用synchronized. 一.如何解决线程安全问题? 一般 ...

  7. Java多线程学习(一)Java多线程入门

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79640870 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  8. java多线程以及Android多线程

    Java 多线程 线程和进程的区别 线程和进程的本质:由CPU进行调度的并发式执行任务,多个任务被快速轮换执行,使得宏观上具有多个线程或者进程同时执行的效果. 进程:在操作系统来说,一个运行的程序或者 ...

  9. Java 多线程并发编程一览笔录

    Java 多线程并发编程一览笔录 知识体系图: 1.线程是什么? 线程是进程中独立运行的子任务. 2.创建线程的方式 方式一:将类声明为 Thread 的子类.该子类应重写 Thread 类的 run ...

随机推荐

  1. linux设置静态获取ip

    vsphere client 创建虚拟机后,默认是动态获取ip ,如果想要改为静态ip: 修改网卡eth0 (不一定每个人都是eth0,比如有的是ens160) vim /etc/sysconfig/ ...

  2. C Primer Plus(第六版)中文版 中的错误1

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define TSIZE 45 struct fi ...

  3. 关于github改名问题

    不喜欢github显示的目录名字于是百度了下,更改过程,记录下来,方便日后查看! 首页右上角点击出来菜单,找到Settings按钮点击 左侧找到Account账号菜单点击 找到change usern ...

  4. svg拖拽和缩放

    需求:做机房平面图,用svg实现拖拽和缩放,刚开始一头雾水,不知所措,好在皇天不负有心人........ 本文重点介绍拖拽,单纯实现很简单,但是由于vue项目,机房图有很多事件,拖拽就成了难点 简单介 ...

  5. 小小的js

    //安全登陆不允许iframe嵌入 if (window.top !== window.self) { window.top.location = window.location; } 使用filte ...

  6. SharePoint 2013 - Host-named Site Collection

    1. 详细操作可参考此文章 的 Deployment and configuration for host-named site collections区域,简单来说,需要以下三行PowerShell ...

  7. 【转】C# GDAL 配置

    共生成9个dll,如下图: 1.在程序中添加*_csharp.dll四个文件的引用: 2.将剩余的五个文件复制到程序的Debug文件夹中:(如果不复制这五个文件就会出现类似“OSGeo.GDAL.Gd ...

  8. 在 Mac OS X 上安装 Docker(转)

    http://www.oschina.net/translate/installing-docker-on-mac-os-x?print 在 Mac OS X 上安装 Docker 注意:Docker ...

  9. python 案例一(电话铺)

    经过自己努力,做了一个简单的电话铺的录入和查询小程序,比较简单,喜欢的朋友可以练练手. 题目: 创建你自己的命令行 地址簿 程序.在这个程序中,你可以添加.修改.删除和搜索你的联系人(朋友.家人和同事 ...

  10. 关于IE8下media query兼容的解决方案探讨

    在国内IE8至少还占有20%的市场份额,所以在做网站时,必须得为这部分用户特殊兼容考虑. 一方面IE8上面很多css3定义的标签不能使用,另外一方面javascript的addEventListene ...