`
squall140
  • 浏览: 140888 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

线程的四种创建模式以及使用实例

 
阅读更多

线程的创建主要有四种方式,

一种是直接继承Thread实现,

另一种是引用接口Runable。

 

也可以运用内部类实现接口的创建。但是用这种方法创建的线程只能用一次。以下就是线程的四种创建方式的相关代码:

 

 

 

 
 public class TestThread {
         public static void main(String[] args) {
                 MyThread1 mt = new MyThread1();
                 MyThread2 mt2 = new MyThread2();
                 mt.start();
                 new Thread(mt2).start();
                 new Thread() {//内部类实现
                         public void run() {
                                 for (int i = 0; i < 100; i++) {
                                         System.out.println("++++线程3++++++" + i);
                                 }
                         }
                 }.start();
                 new Thread(new Runnable() {
                         
                         @Override
                         public void run() {
                                 for (int i = 0; i < 100; i++) {
                                         System.out.println("******线程4****" + i);
                                 }
                         }
                 }).start();
                 for (int i = 0; i < 100; i++) {
                         System.out.println("******主线程****" + i);
                 }
         }
 }
 /**
  * 
  * 四种方法实现线程的创建,两种运用的是内部类 一种是实现接口,一种是继承线程
  * 
  */
 class MyThread1 extends Thread {
         @Override
         public void run() {
                 for (int i = 0; i < 100; i++) {
                         System.out.println("++++线程一++++++" + i);
                 }
         }
 }
 class MyThread2 implements Runnable {
         @Override
         public void run() {
                 for (int i = 0; i < 100; i++) {
                         System.out.println("-----线程二-------" + i);
                 }
         }
 }

 

 

当想让线程暂时暂停,进入休眠状态,可以用Sleep实现,该方法是静态方法,可以直接被Thread引用。可以在方法中设置休眠的时间。下面通过一个例子来说明Sleep的用法

 



 import java.io.IOException;
 import java.nio.CharBuffer;


 public class TestSleep {
         public static void main(String[] args) {
                 Runner r = new Runner();
                 Thread t1 = new Thread(r);
                 Thread t2 = new Thread(r);
                 t1.start();
                 t2.start();
         }
 }
 class Runner implements Runnable {
         @Override
         public void run() {
                 for (int i = 0; i < 200; i++) {
                         if (i % 10 == 0 && i != 0) {
                                 try {
                                         Thread.sleep(1000); //Sleep的用法
                                 } catch (InterruptedException e) {
                                         e.printStackTrace();
                                 }
                         }
                         System.out.println("——————————线程————————————" + i);
                 }
         }
 }
 

当想让一个线程先执行完再去执行另一个线程时,可以用Join方法将当前线程先执行完。下面通过一个例子来说明Join的用法。


 public class TestJoin {
         public static void main(String[] args) {
                 MyThread2 t1 = new MyThread2("zhangcun");
                 t1.start();
                 try {
                     t1.join();//先执行调用join方法的线程对象的run方法,完成后才调用这条语句所在的线程
                 } catch (InterruptedException e) {
                         e.printStackTrace();
                 }
 
                 for (int i = 1; i <= 10; i++) {
                         System.out.println("------i am main thread");
                 }
         }
 }
 class MyThread2 extends Thread {  
         MyThread2(String s) {
                 super(s);
         }
         public void run() {
                 for (int i = 1; i <= 10; i++) {
                         System.out.println("I am " + getName());
                         try {
                                 sleep(1000);
                         } catch (InterruptedException e) {
                                 System.out.println("又被打爆了!");
                                 return;
                         }
                 }
         }
 }
 

当需要一个线程让出当前执行状态即CPU,给其他线程执行的机会,就需要使用Yield方法,使当前线程暂时阻塞,让程序去执行其他的线程。还是通过一个例子来说明。

 

 


 public class TestYield {
         public static void main(String[] args) {
                 MyYield my1 = new MyYield();
                 MyYield2 my2 = new MyYield2();
                 my1.start();
                 my2.start();
 
         }
 }
 class MyYield extends Thread {
         @Override
         public void run() {
                 for (int i = 0; i < 100; i++) {
                         System.out.println("数字为:" + i);
                         if (i % 10 == 0 && i != 0) {
                                 yield();
                         }
                 }
         }
 }
 class MyYield2 extends Thread {
         @Override
         public void run() {
                 for (int i = 0; i < 100; i++) {
                         System.out.println("线程二数字为:" + i);
                         if (i % 10 == 0 && i != 0) {
                                 yield();
                         }
                 }
         }
 }

 

判断当前线程是否还在执行可以使用Thread.currentThread().isAlive()实现。

如果想让某一个线程的优先级优先,可以通过setPriority来设置线程的优先级。当然也会有一个getPriority来获取优先级MinPriority=1,MaxPriority=10,NomPriority=5。下面通过一个例子来说明setPriority的用法。

 


 public class TestPriority {
         public static void main(String[] args) {
                 T1 t = new T1();
                 T2 tt = new T2();
                 tt.setPriority(Thread.NORM_PRIORITY + 4);//设置线程的优先级来改变线程的优先级
                 t.start();
                 tt.start();
         }
 }
 class T1 extends Thread {
 
         @Override
         public void run() {
                 for (int i = 0; i < 100; i++) {
                         System.out.println("线程T1" + i);
                 }
         }
 }
 class T2 extends Thread {
 
         @Override
         public void run() {
                 for (int i = 0; i < 100; i++) {
                         System.out.println("--------线程T2" + i);
                 }
         }
 }
 

 

如果想实现当一个线程在占用一个资源时,不让别的线程来抢占资源,可以使用synchronized来修饰方法或者语句块,这样别的线程就不会进入synchronized修饰的方法或者方法块。

wait()和sleep()的区别:

<1>wait()时别的线程可以访问锁定对象。

<2>调用该方法时必须锁定该对象。

<3>sleep()时别的线程不可以访问锁定对象。

如果两个线程互相占用对方资源,那么线程将会进入死锁状态,在实现线程时,应该尽量避免死锁情况。下面就是一个典型的死锁例子,在编程时,我们应该要避免死锁的发生。

死锁例子:

 


 public class TestDeadLock implements Runnable {
         public int flag = 1;
         static Object o1 = new Object(), o2 = new Object();
         @Override
         public void run() {
                 System.out.println("flag=" + flag);
                 if (flag == 1) {
                         synchronized (o1) {
                                 try {
                                         Thread.sleep(500);
                                 } catch (Exception e) {
                                         e.printStackTrace();
                                 }
                                 synchronized (o2) {
                                         System.out.println("1");
                                 }
                         }
                 }
                 if (flag == 0) {
                         synchronized (o2) {
                                 try {
                                         Thread.sleep(500);
                                 } catch (Exception e) {
                                         e.printStackTrace();
                                 }
                                 synchronized (o1) {
                                         System.out.println("0");
                                 }
                         }
                 }
         }
         public static void main(String[] args) {
                 TestDeadLock td1 = new TestDeadLock();
                 TestDeadLock td2 = new TestDeadLock();
                 td1.flag = 1;
                 td2.flag = 0;
                 Thread t1 = new Thread(td1);
                 Thread t2 = new Thread(td2);
                 t1.start();
                 t2.start();
         }
 }

 

 

 

分享到:
评论

相关推荐

    单例模式,属于创建类型的一种常用的软件设计模式 通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中

    在懒汉式基础上利用synchronize关键字和volatile关键字确保第一次创建时没有线程间竞争而产生多个实例,仅第一次创建时同步,性能相对较高 登记式。作为创建类的全局属性存在,创建类被装载时创建 枚举。java中枚举...

    C++ 多线程和多线程下的单例模式

    本资源描述了C++11 中多线程的创建,C++11中std命名空间中将boost库中的Thread加入,boost多线程从准标准变为标准,其中还介绍了C++ 多线程下的单例模式的使用,本文档为txt文档

    创建型 结构型 设计型设计模式相关知识

    在静态方法中创建实例,避免多个线程同时调用方法,我们可以加线程锁, 在方法中使用双判断语句:最外层判断是为了提高运行速率,检查如果静态字段中已经存在实例了就可以直接return;第二层判断是避免创建多个对象...

    Qt线程安全单例模式写日志模式

    保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例,具有线程安全,多线程测试通过。 1.打开日志并创建日志文件夹 默认为程序启动路径 2.清理日志文件下日志数量 默认保留90...

    C++Builder精彩编程实例集锦的源代码前3部分.rar

    实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何...

    java范例开发大全

    实例55 一维数组的创建与使用 78 实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 ...

    VB.Net-C#多线程Thread-代理委托delegate编程

    VB.NET多线程——创建新线程.txt VB.NET多线程——高级同步技术.txt VB.NET多线程——线程池.txt Visual C#多线程参数传递浅析.txt WebBrowser控件-弹出新窗体和关闭窗口.txt WebBrowser控件的简单应用2.txt 多线程...

    C++Builder精彩编程实例集锦的源代码后3部分.rar

    实例055 如何创建多线程程序 实例056 如何创建可独立执行程序 实例057 如何编写单文档应用程序 实例058 如何编写多文档应用程序 实例059 如何编写COM服务器程序 实例060 如何编写COM客户端程序 实例061 如何...

    VC 如何创建UI类型的对话框线程.rar

    VC 如何创建UI类型的对话框线程,这是本实例的源码,运行本实例后,点击窗口上的按钮,它将创建一个对话框线程,也就是UI线程,其实很简单的方法就可实现,在以后编程中是很实用的。  BOOL CUIThread::InitInstance...

    一个多线程串口数据接收类 VC 环境.rar

    一个用于VC 环境的多线程串口数据接收类代码,示例实现了一个简洁易用的多线程串行通讯接口,可以以切换查询和自动接收两种模式进行对串口数据收发,窗体如上所示。实现选择串口、选择接收模式、发送数据、同步接收...

    Python单例模式实例详解

    2,让类自身保存他的唯一实例,这个类可以保证没有其他实例可以被创建。 多线程时的单例模式:加锁-双重锁定 饿汉式单例类:在类被加载时就将自己实例化(静态初始化)。其优点是躲避了多线程访问的安全性问题,缺点...

    Visual C++ MFC扩展编程实例.PDF

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    JAVA多线程并发下的单例模式应用

    单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用。 首先我们先来看一下单例模式的定义: 一个类有...

    JAVA 范例大全 光盘 资源

    实例3 在Eclipse中创建第一个Java程序 4 常见问题 javac不是内部或者外部命令 6 常见问题 找不到类文件 6 常见问题 语法错误 7 第2章 Java基础语法 9 实例4 变量和常量 9 实例5 基本数据类型转换 10 实例6 ...

    VISUAL C MFC扩展编程实例与源码

    14.6 实例58:向用户界面线程发送消息 342 14.7 实例59:线程间的数据共享 343 第15章 其他 347 15.1 实例60:创建定时器 347 15.2 实例61:播放声音 349 15.3 实例62:创建VC++宏 350 15.4 实例63:使用函数...

    C#源码大集合 02(共3卷)

    │ │ └─实例125 如何使用水晶报表向导创建报表 │ ├─第7章 网络应用 │ │ ├─实例126 如何下载网页 │ │ ├─实例127 如何上下载文件 │ │ ├─实例128 如何自制浏览器 │ │ ├─实例129 如何检查邮件数量...

    Java范例开发大全 (源程序)

     实例55 一维数组的创建与使用 78  实例56 按相反的顺序输出 79  实例57 奇偶分组 80  实例58 找宝 81  实例59 寻找最小数 82  实例60 我的位置在哪里 83  实例61 复制数组 85  实例62 插入新元素 86...

    java范例开发大全(pdf&源码)

    实例55 一维数组的创建与使用 78 实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 ...

Global site tag (gtag.js) - Google Analytics