Java基础回顾(三)
来源:互联网 发布:淘宝家装频道 编辑:程序博客网 时间:2024/05/16 05:43
一:多线程
(1)概述:在一个线程中有多条执行路径
进程: 正在执行的程序,它代表着应用程序的执行区域.
线程: 进程的执行路径.
(2)创建线程的两种方式
1:继承Thread类,实现run方法
举例:
class MyThread extends Thread
{
public void run()
{
for(int i=0; i<10; i++)
{
System.out.println(getName()+"***"+i);
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.start();//调用Thread方法启动线程
my2.start();
for(int i=0; i<10; i++)
{
System.out.println(Thread.currentThread().getName()+"***"+i);
}
}
}
2:实现Runable接口,然后实现run方法
class MyThread implements Runnable
{
public void run()
{
for(int i=0; i<10; i++)
{
//getName()这个是Thread类的.所以在这个类中就不能通过getName()获取线程的名字
//System.out.println(getName()+"***"+i);
//Thread.currentThread()获取当前线程对象的引用
System.out.println(Thread.currentThread().getName()+"***"+i);
}
}
}
class ThreadDemo5
{
public static void main(String[] args)
{
MyThread my = new MyThread();
Thread t1 = new Thread(my);//是用Thread的构造方法启动线程,可以给这个线程传个名字.
Thread t2 = new Thread(my);
t1.start();
t2.start();
}
}
二:同步代码块与同步函数
由于多线程抢占CPU执行权,造成了线程的随机性,所以多线程是不安全的,这里就需要同步代码块与同步函数来解决了.
同步代码块举例:
class Ticket implements Runnable
{
private int tickets = 100;
Object obj = new Object();
Demo d = new Demo();//这里d对象是任意的,主要是创建一个锁给同步代码块使用.
public void run()
{
while(true)
{
//t1,t2,t3,t4 同时进来看哪个线程抢到锁,抢到了锁.别的线程就进不去了.解决了安全问题
synchronized(d) //将产生不安全的代码使用同步代码块.
{
if(tickets>0)
{
try
{
//睡眠100毫秒
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName()+"***"+(tickets--));
}
}
}
}
}
class Demo
{
}
class ThreadDemo8
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
Thread t4 = new Thread(t,"窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
同步函数举例:
class Ticket implements Runnable
{
private int tickets = 100;
Object obj = new Object();
public void run()
{
while(true)
{
show();
}
}
public synchronized void show()
{
if(tickets>0)
{
try
{
//睡眠100毫秒
Thread.sleep(100);
}
catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName()+"***"+(tickets--));
}
}
}
class FunctionDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t,"窗口1");
Thread t2 = new Thread(t,"窗口2");
Thread t3 = new Thread(t,"窗口3");
Thread t4 = new Thread(t,"窗口4");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
- Java基础回顾(三)
- [原]基础回顾--JAVA集合框架(三)
- JAVA回顾(三)
- java反射回顾<三>
- Python 基础回顾(三)
- 关于Java基础回顾
- Java基础回顾(一)
- Java基础回顾(二)
- Java基础回顾(四)
- Java基础回顾(五)
- java基础回顾
- java基础回顾
- GEM_02 Java基础回顾
- java基础回顾1
- java基础回顾2
- java基础概念回顾
- Java基础回顾(1)
- Java基础回顾(2)
- 大规模网站架构实战之体系结构(一)
- js继承问题
- 手机流言终结者:手机能拍红外透视照?
- 英文版SQL Server,命令中输入中文,结果是乱码的解决方案(转帖+亲自实践)
- SQL Injection through HTTP Headers
- Java基础回顾(三)
- 自定义标签内嵌Struts2标签的解决方法
- C语言常用宏定义
- 关闭Apache的目录浏览功能
- Dynamics AX 2012之于离散制造(Discrete Manufacturing)和工艺制造(Process Manufacturing)
- java设计模式—动态代理模式
- weblogic启动报错
- Ubuntu 12.04 LTS 更新源方法(加快获取软件的速度,查找某些包是否存在,更新某些常用软件)
- sql语句技巧