博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java:创建线程
阅读量:5048 次
发布时间:2019-06-12

本文共 4172 字,大约阅读时间需要 13 分钟。

Java定义了两种创建线程的方法:

1.实现Runnable接口

要实现Runnable接口,只需简单地实现run()方法即可,声明如下:public void run()

在run()方法中,可以定义构成新线程的代码。需重点理解的是,run()可以调用其它方法、使用其他类和声明变量,就像主线程能做的那样。唯一的区别是:run()方法是程序的另一个并发的执行线程的进入店,这个线程在run()方法返回时结束。

创建新线程以后,直到调用了它的start()方法后才会执行。本质上,start()执行对run()的调用。

// Create a second thread.public class NewThread implements Runnable{    Thread t;    NewThread(){        t=new Thread(this,"Demo Thread");        System.out.println("Child thread: "+t);        t.start();    }        // This is the entry point of the second thread.    public void run(){        try{            for(int i=5;i>0;i--){                System.out.println("Child thread: "+i);                Thread.sleep(500);            }        }        catch(InterruptedException e){            System.out.println("Child thread interrupted");        }        System.out.println("Exiting child thread");    }}class ThreadDemo{    public static void main(String args[]){        new NewThread();        try{            for(int i=5;i>0;i--){            System.out.println("Main thread: "+i);            Thread.sleep(1000);        }    }    catch(InterruptedException e){        System.out.println("Main thread interrupted");    }    System.out.println("Exiting Main thread");    }}

输出:

Child thread: Thread[Demo Thread,5,main]

Main thread: 5
Child thread: 5
Child thread: 4
Main thread: 4
Child thread: 3
Child thread: 2
Main thread: 3
Child thread: 1
Exiting child thread
Main thread: 2
Main thread: 1
Exiting Main thread

 

2. 扩展Thread类本身

第二种创建线程的方法是创建一个扩展Thread类的新类,然后创建该类的一个实例。这个扩展的类必须重写run()方法,这是新线程的进入点,同时它也必须调用start()方法来执行线程。

// Create a second thread.public class NewThread extends Thread{    NewThread(){        super("Demo thread");        System.out.println("Child thread: "+this);        start();    }        // This is the entry point of the second thread.    public void run(){        try{            for(int i=5;i>0;i--){                System.out.println("Child thread: "+i);                Thread.sleep(500);            }        }        catch(InterruptedException e){            System.out.println("Child thread interrupted");        }        System.out.println("Exiting child thread");    }}class ThreadDemo{    public static void main(String args[]){        new NewThread();        try{            for(int i=5;i>0;i--){            System.out.println("Main thread: "+i);            Thread.sleep(1000);        }    }    catch(InterruptedException e){        System.out.println("Main thread interrupted");    }    System.out.println("Exiting Main thread");    }}

输出:

Child thread: Thread[Demo thread,5,main]

Main thread: 5
Child thread: 5
Child thread: 4
Main thread: 4
Child thread: 3
Child thread: 2
Main thread: 3
Child thread: 1
Exiting child thread
Main thread: 2
Main thread: 1
Exiting Main thread

 

同步:当两个或多个线程需要访问同一共享资源时,需要某种方式来确保资源在某一时刻只被一个线程使用,这个方式称为同步。

不使用同步的例子:

class Callme{     void call(String msg){        System.out.print("["+msg);        try{            Thread.sleep(1000);        }        catch(InterruptedException e){            System.out.println("Interrupted");        }        System.out.println("]");    }}class Caller implements Runnable{    String msg;    Callme target;    Thread t;    public Caller(Callme targ, String s){        target=targ;        msg=s;        t=new Thread(this);        t.start();    }        public void run(){        target.call(msg);    }}public class Synch {    public static void main(String args[]){        Callme target=new Callme();        Caller ob1=new Caller(target,"Hello");        Caller ob2=new Caller(target,"Synchronized");        Caller ob3=new Caller(target,"World");                try{            ob1.t.join();            ob2.t.join();            ob3.t.join();        }        catch(InterruptedException e){            System.out.println("Interrupted");        }    }}

输出:

[Hello[World[Synchronized]

]
]

 

使用同步,只需简单地在call()的定义前面加上关键字synchronized即可

class Callme{     synchronized void call(String msg){

输出:

[Hello]

[Synchronized]
[World]

 

当不能在类相应的方法中添加synchronized关键字时,只需要将对该类方法的访问置于一个synchronized快中

public void run(){        synchronized(target){        target.call(msg);        }    }

 

转载于:https://www.cnblogs.com/LilianChen/p/3476719.html

你可能感兴趣的文章
关于cookie存取中文乱码问题
查看>>
k8s架构
查看>>
select 向上弹起
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
bzoj 5252: [2018多省省队联测]林克卡特树
查看>>
https 学习笔记三
查看>>
华为“云-管-端”:未来信息服务新架构
查看>>
基于Sentinel实现redis主从自动切换
查看>>
函数(二)
查看>>
oracle中所有存在不存在的用户都可以使用dba连接到数据库
查看>>
函数式编程思想
查看>>
java安全沙箱(二)之.class文件检验器
查看>>
Oracle学习之简单查询
查看>>
log4j配置
查看>>
linux 配置SAN存储-IPSAN
查看>>
双链表
查看>>
java学习笔记之String类
查看>>
pymysql操作mysql
查看>>
Linux服务器删除乱码文件/文件夹的方法
查看>>