初学Java多线程的基本概念

一:线程与之前所学的进程区别:
进程:系统进行资源分配的最小单位,资源是独立的
线程:CPU调度的最小的单位,线程间共享资源。多线程几个线程共占据一个进程,单线程独占一个线程。

公司主营业务:网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出泽库免费做网站回馈大家。

主线程就像是前台接待,当工作量太多时,就指挥子线程去完成对应工作。

二,如何创建线程
继承Thread类和实现Runnable接口。
在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。

Thread构造函数:

public Thread( );
public Thread(Runnable target);
public Thread(String name);
public Thread(Runnable target, String name);
public Thread(ThreadGroup group, Runnable target);
public Thread(ThreadGroup group, String name);
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);

第一类:

public class ThreadDemo{
     public static void main(String[] args){
         Demo d = new Demo();//创建多线程
         d.start();//启动线程
         for(int i=0;i<60;i++){
             System.out.println(Thread.currentThread().getName()+i);//打印当前线程名称
         }

     }
 }
 class Demo extends Thread{//继承thread类
     public void run(){//run方法相当于线程的行动指南(做什么工作)
         for(int i=0;i<60;i++){
             System.out.println(Thread.currentThread().getName()+i);//打印名字
         }
     }
 }

第二类:
public class ThreadDemo{
public static void main(String[] args){
Demo d =new Demo();
Thread t = new Thread(d);//Thread类或它的子类的实例。
t.start();
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
class Demo implements Runnable{
public void run(){
for(int x=0;x<60;x++){
System.out.println(Thread.currentThread().getName()+x);
}
}
}
三:如何终止线程。

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

  2. 使用stop方法强行终止线程(这个方法不推荐使用,可能发生不可预料的结果)。

  3. 使用interrupt方法中断线程。
    举例子:A通知B A.interrupt() A将指示灯置亮,B发生中断,(如果B睡着的话,会存在通知不及时的情况)
    B如何查看指示灯状态。Thread.interrupted()和Thread.isinterrupted()

    Thread.isinterrupted()会将指示灯复位,置回原来的状态。可查看任意线程的状态。
    Thread.interrupted()不会将指示灯复位,只可查看当前线程的状态。

    四:多线程安全问题
    问题原因:当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没执行完,另一个线程参与进来执行,导致共享数据的错误。

解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不执行。

两个关键字:
volatile修饰变量,实现可见性,当线程的工作内存数据改变,主内存也随之改变,
synchronized修饰方法,实现加锁功能,当CPU发生调度时,保证自己的工作不会受别人打扰。
同步代码块:


public class ThreadDemo3 {
    public static void main(String[] args){
        Ticket t =new Ticket();
        Thread t1 = new Thread("线程一");
        Thread t2 = new Thread("线程二");
        Thread t3 = new Thread("线程三");
        Thread t4 = new Thread("线程四");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Ticket implements Runnable{
    private int ticket =400;
    public void run(){
        while(true){
            synchronized (new Object()) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
    e.printStackTrace();
                }
                if(ticket<=0)
                    break;
                System.out.println(Thread.currentThread().getName()+ticket--);
            }
        }
    }
}

同步函数:
public class ThreadDemo3 {
    public static void main(String[] args){
        Ticket t =new Ticket();
          Thread t1 = new Thread("线程一");
        Thread t2 = new Thread("线程二");
        Thread t3 = new Thread("线程三");
        Thread t4 = new Thread("线程四"););
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
class Ticket implements Runnable{
    private int ticket = 4000;
    public synchronized void  saleTicket(){
        if(ticket>0)
            System.out.println(Thread.currentThread().getName()+ticket--);

    }
    public void run(){
        while(true){
            saleTicket();
        }
    }
}

标题名称:初学Java多线程的基本概念
路径分享:http://scyanting.com/article/jshcso.html