创建线程的方式有两种:

第一种:使用线程类Thread或者继承它的子类创建线程对象

第二种:定义接口类实现接口Runnable创建线程对象

多线程的好处:可以整合资源,提高系统资源的利用率

多线程中提供了同步方法、同步代码块以及加锁的方式实现多线程的同步

实现多线程:

classThread中有两个最重要的函数run()和start()。

1)    run()函数必须进行覆写,把要在多个线程中并行处理的代码放到这个函数中。

2)    虽然run()函数实现了多个线程的并行处理,但我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。在调用start()的时候,start()函数会首先进行与多线程相关的初始化(这也是为什么不能直接调用run()函数的原因),然后再调用run()函数。

一、简单的多线程举例如下:

需求:设计一个模拟用户从银行取款的应用程序。设某银行账户存款额的初值为2000元,用线程模拟两个用户分别从银行取款的情况。两个用户分4次分别从银行的同一账户取款,每次取100元。

//方式一:继承Thread,并在同步方法中实现多线程同步

class Bank        //定义银行类
{
private static int Money=2000;
public static synchronized void getmoney(int x) //同步方法
{
Money = Money - x;
try{Thread.sleep(10);}
catch(InterruptedException e){};
System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+" 元");
}
}
class Custom extends Thread //定义线程类继承Thread
{
public void run()
{
for(int i=0;i<4;i++)
{
Bank.getmoney(100);
}
}
}
class CustomBank
{
public static void main(String[] args)
{
Custom c1 = new Custom(); //创建两个线程c1、c2
Custom c2 = new Custom();
c1.start();
c2.start();
}
}

//方式二:继承Thread,并在同步代码块中实现多线程同步

class Bank        //定义银行类
{
private static int Money=2000;
public static void getmoney(int x)
{
synchronized(Bank.class) //同步代码块
{
Money = Money - x;
try{Thread.sleep(10);}
catch(InterruptedException e){};
System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+"元");
}
}
}
class Custom extends Thread //定义线程类继承Thread
{
public void run()
{
for(int i=0;i<4;i++)
{
Bank.getmoney(100);
}
}
}
class CustomBank1
{
public static void main(String[] args)
{
Custom c1 = new Custom(); //创建两个线程c1、c2
Custom c2 = new Custom();
c1.start();
c2.start();
}
}

//方式三:实现Runnable接口,在同步方法或同步代码块中实现多线程同步

class Bank        //定义银行类
{
private int Money=2000;
public synchronized void getmoney(int x) //同步方法
{
{
Money=Money-x;
try{Thread.sleep(10);}catch(Exception e){};
System.out.println(Thread.currentThread().getName()+"剩余存款是:"+Money+" 元");
}
}
} class Custom implements Runnable //定义接口类实现接口Runnable
{
private Bank b = new Bank();
public void run()
{
for(int i=0;i<4;i++)
{
b.getmoney(100);
}
}
}
class CustomBank2
{
public static void main(String[] args)
{
Custom c = new Custom();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}

二、线程的技巧性写法:利用匿名内部类创建互不相关的多个线程

class Demo3
{
public static void main(String[] args)
{
//第一个线程
new Thread()
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"...."+i);
}
} }.start(); //第二个线程
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"...."+i);
} //第三个线程
Runnable r = new Runnable()
{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"...."+i);
}
} };
new Thread(r).start();
}
}

三、基本的线程的其他几种方法:

1、线程对象.setDaemon()   设置守护线程

2、线程对象.join()            等待该线程结束(顺序执行线程)

3、Thread.yield()              暂停当前正在执行的线程,执行其他的线程

4、线程对象.toStirng()      返回线程的名称、优先级、线程组

5、线程对象.setPriority()  设置线程的优先级

6、线程对象.getPriority()  获得线程的优先级

7、线程对象.interrupt()    中断当前线程

8、线程对象.isAlive()       判断线程是否正在运行

举例如下:

class DemoThread extends Thread
{
public void run()
{
for(int i=0;i<20;i++)
{
try
{
Thread.sleep(10);
}
catch (InterruptedException e)
{
System.out.println(e.toString());
}
System.out.println(Thread.currentThread().getName()+"......"+i);
//Thread.yield();
}
}
}
class Demo2
{
public static void main(String[] args) throws InterruptedException
{
DemoThread t1 = new DemoThread();
DemoThread t2 = new DemoThread(); //t1.setPriority(Thread.MIN_PRIORITY);//t1.setPriority(1);
//t2.setPriority(Thread.MAX_PRIORITY);//t2.setPriority(10); //t1.setDaemon(true);
//t2.setDaemon(true); t1.start();
//t1.join();
//t1.interrupt(); t2.start();
//t2.join();
//t2.interrupt(); System.out.println("t1线程是否正在运行:"+t1.isAlive());
System.out.println("t2线程是否正在运行:"+t2.isAlive()); System.out.println("t1线程的优先级是:"+t1.getPriority());
System.out.println("t2线程的优先级是:"+t2.getPriority()); System.out.println("t1线程的名称、优先级、线程组"+t1.toString());
System.out.println("t2线程的名称、优先级、线程组"+t2.toString()); for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread().getName()+"......"+i);
}
System.out.println("over");
}
}

Java:多线程的更多相关文章

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. Java多线程基础知识篇

    这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...

  3. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  4. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  5. Java多线程--让主线程等待子线程执行完毕

    使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...

  6. Java多线程 2 线程的生命周期和状态控制

    一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就 ...

  7. java 多线程 1 线程 进程

    Java多线程(一).多线程的基本概念和使用 2012-09-10 16:06 5108人阅读 评论(0) 收藏 举报  分类: javaSE综合知识点(14)  版权声明:本文为博主原创文章,未经博 ...

  8. 一起阅读《Java多线程编程核心技术》

    目录 第一章 Java多线程技能 (待续...)

  9. 第一章 Java多线程技能

    1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...

  10. java从基础知识(十)java多线程(下)

    首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...

随机推荐

  1. xml基础学习笔记02

    接着上次的xml笔记01 ,记录一下如何DOM创建xml 一.由于没有特意来写博客,都是在程序中用注释的方法记录笔记,整理过来难免格式错误,排版什么的,大家好事看不懂就仔细看给出的代码加上注释,一定会 ...

  2. android开发 替换bitmap中的颜色值

    /** * 将bitmap中的某种颜色值替换成新的颜色 * @param bitmap * @param oldColor * @param newColor * @return */ public ...

  3. 【Longest Palindromic Substring】cpp

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  4. Java中HashMap排序

    注: 转载于 http://www.cnblogs.com/xingyun/archive/2012/12/09/2809962.html package com.holdobject; import ...

  5. 打印xls注意事项

    1.ctrl+p 2.打印机选择 就绪的,不是脱机的,不要只看打印机的名字. 3.打印名单信息的话 要用横向打印 4.从数据库里导出来的数据xls可能在excel里没显示完全,比如学号.身份证号等(e ...

  6. Fiddler 过滤 css,图片等请求url 正则表达式

    设置步骤: 1.勾选 Request Headers 中的 Hide if url contains 过滤项 2.贴入下方正则表达式 REGEX:(?insx)/[^?/]*.(css|ico|jpg ...

  7. 在linux下安装eclipse 开发c语言程序

    一,下载jdk tar -xvzf jdk-8u45-linux-x64.tar.gz  //解压并安装jdk 二,修改环境配置变量 vim /home/woshareliu/.bashrc 加入如下 ...

  8. Ubuntu下开启ssh服务

    网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务.最终成功的方法如下: ...

  9. Delphi中@,^,#,$特殊符号意义

    概述:   ^: 指针   @: 取址   #: 十进制符   $: 十六进制符   @:取址运算符; var   int:integer;   p:^integer; begin   new(P); ...

  10. Codeforces449A Jzzhu and Chocolate && 449B Jzzhu and Cities

    CF挂0了,简直碉堡了.两道题都是正确的思路但是写残了.写个解题报告记录一下心路历程. A题问的是 一个n*m的方块的矩形上切k刀,最小的那一块最大可以是多少.不难发现如果纵向切k1刀,横向切k2刀, ...