(1)Java中每个程序至少启动2个线程,一个main线程,一个垃圾回收线程,

(2)判断线程是否启动的方法: isAlive()

(3) 线程的强制执行: join()

Thread.sleep(2000);

(5) demo.interrupt(); //2s后中断线程

(6)demo.setDaemon(true); //后台运行线程

(7)h1.setPriority(8);//线程的优先级,优先级的高低与谁 先执行 还不是必然联系的

(8)线程的 礼让:yield 

(9) 线程的同步和死锁,所谓同步,是指在同一个时间段内只有一个线程在运行,其他线程必须等到这个线程执行完毕后才执行

Java中的同步有两种方式: 同步代码块和同步方法

synchronized  一般将当前对象this作为同步对象

【同步代码块】:

语法格式:

synchronized(同步对象){
 //需要同步的代码
}

【同步方法】

也可以采用同步方法。

语法格式为synchronized 方法返回类型 方法名(参数列表){

    // 其他代码

}

1. 在Java中实现多线程有两种方式,实现Runnable 接口,或者 extends 自Thread类,其实Thread类也是实现了Runnable接口,复写run()方法

// Java 中的 多线程 有两种方式,一个继承自Thread,一种是实现Runnable 接口
class Hello extends Thread
{
private String name;
public Hello()
    {

    }
public Hello(String name)
    {
this.name = name;
    }
public void run()
    {
for(int i = 0;i < 10;i ++)
        {
            System.out.println(name + "运行    " + i);
        }
    }

public static void main(String [] args)
    {
        Hello h1 = new Hello("hello1");
        Hello h2 = new Hello("hello2");
        h1.start();
        h2.start();
    }

}

  

public class hello2 implements Runnable{
private String name;
public hello2()
    {

    }
public hello2(String name)
    {
this.name = name;
    }

    @Override
public void run() {
// TODO Auto-generated method stub
        for(int i = 0;i < 10;i ++)
        {
            System.out.println(name + "运行" + i);
        }
    }
public static void main(String [] args)
    {
        hello2 h1  = new hello2("hello1");
        hello2 h2 = new hello2("hello2");
        Thread t1 = new Thread(h1);
        Thread t2 = new Thread(h2);

        t1.start();
        t2.start();

    }
}

  不过两种方式的不同之处在于,实现Runnable接口的,还要使用Thread 去包装一下下 ,就是所谓的代理模式

    区别,到底选择哪种呢?

   如果不需要共享资源,继承Thread就行,Runnable接口的则是需要共享资源

/**
 * @author Rollen-Holt 继承Thread类,不能资源共享
 * */
class hello extends Thread {
public void run() {
for (int i = 0; i < 7; i++) {
if (count > 0) {
                System.out.println("count= " + count--);
            }
        }
    }

public static void main(String[] args) {
        hello h1 = new hello();
        hello h2 = new hello();
        hello h3 = new hello();
        h1.start();
        h2.start();
        h3.start();
    }

private int count = 5;
}

  而选择实现接口,而可以实现资源的共享

/**
 * @author Rollen-Holt 继承Thread类,不能资源共享
 * */
class hello implements Runnable {
public void run() {
for (int i = 0; i < 7; i++) {
if (count > 0) {
                System.out.println("count= " + count--);
            }
        }
    }

public static void main(String[] args) {
        hello he=new hello();
new Thread(he).start();
    }

private int count = 5;
}

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

Thread.currentThread().getName()用于获得线程的名字

如果我们没有指定名字的话,系统自动提供名字

thread-0 main方法其实也是一个线程

Java中每个程序都至少启动两个线程,一个main线程,一个垃圾回收线程

经典的生产者消费者

解决方案:使用同步,加入等待和唤醒

一个不会敲代码的程序员