java多线程

来源:互联网 发布:英雄联盟有mac版本吗 编辑:程序博客网 时间:2024/06/06 00:51
1、多线程
package thread;


/*
 * 多线程extends Thread;new TestThread().start()启动线程会调用run方法
 *要实现多线程必须继承Thread类,覆盖run方法,
 */
class TestThread extends Thread{
public void run(){
int i=0;
while(i<10){
System.out.println("run:"+Thread.currentThread().getName());
i++;
}
}


}
public class MyDemo {


public static void main(String args[]){
new TestThread().start();
int j=0;
while(j<10){
System.out.println("Main:"+Thread.currentThread().getName());
j++;
}
}
}
2、后台线程:如果某个线程对象在启动之前(调用start方法志之前),调用了setDaemon(true)方法,这个线程就变成了后台线程;
java中,只要有一个前台线程,该进程就不会结束,如果所有线程都是后台线程,这个进程就会结束;
pp.join()的作用是把pp所对应的线程合并到调用了pp.jion()语句的线程中;
3.继承Runnable接口实现多线程:
package thread;


/*
 * implements Runnable实现多线程
 */
class TestThread implements Runnable{
public void run(){
int i=0;
while(i<10){
System.out.println("run:"+Thread.currentThread().getName());
i++;
}
}


}
public class MyDemo {


public static void main(String args[]) throws InterruptedException{
/*
* new一个thread对象,传入一个Runnable类型的线程对象;
*/
Thread thread=new Thread(new TestThread());
/*
*调用star时调用的是Runnable的run方法,不是Thread默认的run;
*/
thread.start();
int j=0;
while(j<10){
System.out.println("main:"+Thread.currentThread().getName());
j++;
}
}
}
---------------------------
----------Thread-----------------
package ticket.demo;
/*
 * 模拟火车售票系统,有四个代售点,同时卖100张火车票
 */
public class Demo {


public static void main(String args[]) {
//new 四个线程对象,每个对象都有自己的100张票
new TestThread().start();
new TestThread().start();
new TestThread().start();
new TestThread().start();
}
}


class TestThread extends Thread {


@Override
public void run() {
int tickets = 100;
while (true) {
if (tickets >= 0) {
System.out.println(Thread.currentThread().getName() + ":"
+ tickets--);
}
}
}


}
------------Runnable--适合多个相同程序代码的线程去处理同一资源的情况-----------------
package ticket.demo;
/*
 * 模拟火车售票系统,有四个代售点,同时卖100张火车票
 */
public class Demo {


public static void main(String args[]) {
//如果要实现四个进程同时卖一百张票,要用继承Runnable接口的方式;
TestThread tt=new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}


class TestThread implements Runnable {


@Override
public void run() {
int tickets = 100;
while (true) {
if (tickets >= 0) {
System.out.println(Thread.currentThread().getName() + ":"
+ tickets--);
}
}
}


}
4.线程同步synchronized关键字;
如果没有线程安全性问题,就不要用线程同步;
package thread;


public class ThreadDemo2 {


public static void main(String args[]) {
MyTest tt = new MyTest();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();


}
}


class MyTest implements Runnable {


int ticket = 100;
String str = new String("");//一定要放在run()方法外面;


@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
/*
* 把需要实现原子性的代码块放在同步代码块里面就能实现同步,关键字Synchronized 传入一个任意的对象
*/
synchronized (str) {
if (ticket > 0) {
try {
/*
* 线程休眠,导致ticket出现负数 要避免线程安全性问题,当ticket=1时,其他线程不能再执行
*/
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":"
+ ticket--);
}
}
}
}
}
----------实现线程同步方法二:把synchronized放在方法里面,同步方法---------------------
package thread;


public class ThreadDemo2 {


public static void main(String args[]) {
MyTest tt = new MyTest();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();


}
}


class MyTest implements Runnable {


int ticket = 100;
String str = new String("");


@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
sale();
}
}
public synchronized void sale(){

if (ticket > 0) {
try {
/*
* 线程休眠,导致ticket出现负数 要避免线程安全性问题,当ticket=1时,其他线程不能再执行
*/
Thread.sleep(10);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":"
+ ticket--);
}
}
}
如果要让代码块和某个方法同步,代码块的出入对象要是this;
5.死锁
6.线程间的通信:
wait():
notify():
notifyAll():
7.线程生命周期的控制
0 0
原创粉丝点击