`

java中的线程

 
阅读更多

如何创建一个控制单元或线程?
第一种方式:
1、继承Thread类。覆盖run方法,将多线程要运行的代码放到run方法中。
2、调用start方法,开启线程,并执行run方法。

<wbr><wbr> ※特性:随机性(每次执行的结果不一样,多个线程抢资源的结果)<br><wbr><wbr> ※创建一个Thread类或其子类,才能够产生一个控制单元.</wbr></wbr></wbr></wbr>

第二种方式:
1、实现Runnable接口,覆盖run方法.
2、调用Thread类建立线程对象,并将实现Runnable接口的子类对象作为参数传递给Thread的构造函数.
3、调用Thread类对象的start方法,开启并运行run方法.

为什么要将Runnable接口的子类对象作为参数传递给Thread类的构造方法呢?为了让多线程去执行自定义的run方法,该
run方法有自己所属的对象,所以将该对象传入.


<wbr>线程的安全问题,产生的原因:<br><wbr>1、多个线程访问出现延迟;<br><wbr>2、线程的随机性;<br><wbr>同步:<br><wbr>1、解决线程的安全问题,同时会消耗资源,降低效率(每个线程都需要去判断同步上的锁). 例子:火车上的卫生间(锁);<br><wbr>2、需要同步的两个前提:①至少两个以上的线程;②多线程使用的是同一把锁;<br><wbr>3、注意同步的死锁,尽量避免同步嵌套的情况.<br><wbr>4、同步的两种表现形式:<br><wbr>①同步代码块,传递一个对象作为锁.<br><wbr>②同步函数,使用this作为锁。使用同步函数时,一定要注意分析哪些需要同步,在Tickets中,如将synchronized放到run方法上,<br><wbr>那么线程进入while无限循环,无法退出,锁无法被其他线程使用.所以,while循环不需要同步,而其中的内容才是需要同步的内容.<br><wbr><br><wbr>注意:1、线程在同步时,还是出现了安全隐患,结果很大程序出现在线程同步问题上,检查是否多线程使用的同一把锁.<br><wbr><wbr><wbr> 2、静态方法的同步函数,锁肯定不是this,因为静态方法不能使用this,这是,锁为方法所在的类的class对象,例如,Tickets.class.<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

class MyThread extends Thread
{
<wbr>private String name;<br><wbr>MyThread(String name)<br><wbr>{<br><wbr><wbr>this.name = name;<br><wbr>}<br><wbr>public void run() //覆盖run方法<br><wbr>{<br><wbr><wbr>for (int x = 0; x &lt; 10 ; x++)<br><wbr><wbr>{<br><wbr><wbr><wbr>System.out.println(Thread.currentThread().getName() + "..name:" + name + "-" + x);<br><wbr><wbr>}<br><wbr>}<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

//铁路售票例子,四个窗口同时售票
class Tickets implements Runnable
{
<wbr>private static int ticketsCnt = 100; //总共100张票<wbr><br><wbr>Object obj = new Object();<br><wbr>boolean b = true;<br><wbr>public void run()<br><wbr>{<br><wbr><wbr>//for (int x = ticketsCnt; x &gt; 0; x--)<wbr> //为什么for循环这样写不行呢?<br><wbr><wbr>if (b)<br><wbr><wbr>{<wbr><wbr><br><wbr><wbr><wbr>while (true)<br><wbr><wbr><wbr>{<wbr><wbr><wbr><wbr><br><wbr><wbr><wbr><wbr>show();<wbr><wbr><wbr><br><wbr><wbr><wbr>}<br><wbr><wbr>}<br><wbr><wbr>else<br><wbr><wbr>{<br><wbr><wbr><wbr>while (true)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr>synchronized(Tickets.class) //(this) //obj<br><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr>if (ticketsCnt &gt; 0)<br><wbr><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr>try<br><wbr><wbr><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr>Thread.sleep(10);<wbr>//模拟线程的安全问题。<br><wbr><wbr><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr><wbr><wbr><wbr>catch (Exception e)<br><wbr><wbr><wbr><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr><wbr><wbr>//<br><wbr><wbr><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr><wbr><wbr><wbr>System.out.println(Thread.currentThread().getName() + " -&gt;code.... " +ticketsCnt--);<wbr><wbr><wbr><br><wbr><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr><wbr>}<br><wbr><wbr><wbr>}<wbr><wbr><wbr><br><wbr><wbr>}<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>public synchronized static void show()<wbr> //同步函数,添加关键字synchronized,锁为this,如果声明为static,则锁为Tickets.class<br><wbr>{<br><wbr><wbr>if (ticketsCnt &gt; 0)<br><wbr><wbr>{<br><wbr><wbr><wbr>try<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr>Thread.sleep(10);<wbr>//模拟线程的安全问题。<br><wbr><wbr><wbr>}<br><wbr><wbr><wbr>catch (Exception e)<br><wbr><wbr><wbr>{<br><wbr><wbr><wbr><wbr>//<br><wbr><wbr><wbr>}<br><wbr><wbr><wbr>System.out.println(Thread.currentThread().getName() + " -&gt;func.... " +ticketsCnt--);<wbr><wbr><wbr><br><wbr><wbr>}<br><wbr>}<br> }</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

class ThreadDemo
{
<wbr>public static void main(String[] args) // 当前程序有三个线程,包括主线程!<br><wbr>{<br><wbr><wbr><br><wbr><wbr>//MyThread d1 = new MyThread("one");<wbr> //线程1<br><wbr><wbr>//MyThread d2 = new MyThread("two -");//线程2<br><wbr><wbr>//d1.start();<br><wbr><wbr>//d2.start();<br><wbr><wbr><br><wbr><wbr>//主线程<br><wbr><wbr>//for (int n = 0; n &lt; 10; n++)<br><wbr><wbr>//{<br><wbr><wbr>//<wbr>System.out.println(Thread.currentThread().getName() + ".." + n);<br><wbr><wbr>//}<br><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr>Tickets t = new Tickets();<br><wbr><wbr>Thread t1 = new Thread(t);<br><wbr><wbr>Thread t2 = new Thread(t);<br><wbr><wbr>//Thread t3 = new Thread(t);<br><wbr><wbr>//Thread t4 = new Thread(t);<br><wbr><wbr><br><wbr><wbr>t1.start();<br><wbr><wbr>try<br><wbr><wbr>{<br><wbr><wbr><wbr>Thread.sleep(10);<wbr>//让主线程停下来,不让程序首先执行 t.b = false;<br><wbr><wbr>}<br><wbr><wbr>catch (Exception e)<br><wbr><wbr>{<br><wbr><wbr><wbr>//<br><wbr><wbr>}<br><wbr><wbr>t.b = false;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr>t2.start();<br><wbr><wbr>//t3.start();<br><wbr><wbr>//t4.start();<br><wbr><wbr><br><wbr>}<br> }<br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

分享到:
评论

相关推荐

    java中线程的应用例子

    这是给开发者提供的一个最基本的java中线程的开发案例,看了就会,学了就懂的,但要注意线程使用的一些问题,很多网站都有,要细细看。

    java中线程的简单处理

    java中线程的简单处理,利用java编程来创建线程等一系列处理。

    java中线程同步方法

    java中线程同步方法的总结,描述的很详细。

    java多线程Demo

    自己写的一些多线程的小Demo,在这里与大家分享一下。

    java中线程队列BlockingQueue的用法

    java中线程队列BlockingQueue的用法

    java中线程的有效使用

    这是一个描述java中线程的小程序,能够很好的关于线程的学习何使用,特别是关于wait(),notify()的使用,很好

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    Java的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java AppletJava的线程和Java Applet

    Java中线程用法总结

    主要介绍了Java中线程用法,实例总结了java中线程的常见使用技巧,需要的朋友可以参考下

    java中线程的创建常见有如三种基本形式实例

    java中线程的创建常见有如三种基本形式实例 说明:https://www.cnblogs.com/personblog/p/14246929.html

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    java多线程读取文件

    Java多线程读大文件 java多线程写文件:多线程往队列中写入数据

    Java中的线程详细介绍 DOC版

    Java中的线程详细介绍 DOC版Java中的线程详细介绍 DOC版

    Java 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 ...

    图解java多线程

    本文主要讲java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的线程函数用法、概述等。首先让我们来了解下在操作系统中进程和线程的区别:

    java多线程ppt

    java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java...

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    java线程第二版中英文 java线程第二版中英文 线程并不是新的概念:许多操作系统和语言都支持它们。在Java出现以前,似乎人人都在谈论线程,却很少有人使用它。用线程编程是技巧性很强的且不可移植。 而在Java中却...

    Java多线程机制(讲述java里面与多线程有关的函数)

    9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 9.9 计时器线程...

Global site tag (gtag.js) - Google Analytics