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. C#学习笔记14

    1.在多个线程的同步数据中,避免使用this.typeof(type).string进行同步锁,使用这3个容易造成死锁. 2.使用Interlocked类:我们一般使用的互斥锁定模式(同步数据)为Lo ...

  2. Java泛型拾遗

    先上百度百科的解释 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方 ...

  3. Django Cookie于Session

    一.Cookie与Session由来 因为Http协议的特性,每一次来自用户浏览器的请求都是无状态且独立的,通俗地说,就是无法保存用户状态,后台服务器根本就不知道当前请求和以前及以后请求是否来自同一用 ...

  4. [SYZOI Round1] 滑稽♂树

    题面 传送门 Sol 我也不知道哪里来的题目哪里来的\(OJ\) 子树变成\(DFS\)序后就是裸的树套树 # include <bits/stdc++.h> # define RG re ...

  5. layui-学习03-页面元素

    布局: 相关样式: 包裹层 : layui-container ( 响应式 宽度 ) layui-fluid ( 100% 宽度 )行        : layui-row列        : lay ...

  6. php接收post过来的json数据

    <html> <head> <title>json</title> <script src="//cdn.bootcss.com/jqu ...

  7. JavaWeb中Servlet和JSP的分工案例

    jsp和Servlet的分工:   * JSP:     > 作为请求发起页面,例如显示表单.超链接.     > 作为请求结束页面,例如显示数据.   * Servlet:     &g ...

  8. 最长公共子序列(LCS)思维导图

  9. C++:关于委托类

    转自:http://blog.csdn.net/dadalan/article/details/4041931.vs2010已经支持function/bind,能很好实现委托. [说明] 本文不仅介绍 ...

  10. wcf 访问控制

    public class PasswordDigestChannelFactory<TPortTypeClient, TPlugin> where TPortTypeClient : Cl ...