/**
* 线程
*/
class ThreadDemo1{
public static void main(String[] args) {
MyThread t1 = new MyThread();
YourThread t2 = new YourThread();
//启动线程
t1.run(); //1个线程.
t2.start();
}
}
class MyThread extends Thread{
//执行线程的时候进行调用,jvm负责调用
public void run(){
while(true){
System.out.println("myThread");
yield(); //放弃cpu的抢占权
}
}
}
//
class YourThread extends Thread{
public void run(){
while(true){
System.out.println("yourThread");
yield();
}
}
}
join
class ThreadDemo2 {
public static void main(String[] args) {
Player p1 = new Player("成龙",5000);
Player p2 = new Player("狄龙",8000);
Player p3 = new Player("史泰龙",2000);
Player p4 = new Player("李小龙",3000);
//
try{
p1.start();
p2.start();
p3.start();
p4.start();
p1.join();
p2.join();
p3.join();
p4.join();
}catch(Exception e){
}
System.out.println("人到齐了,开局!!");
}
}
//玩家.
class Player extends Thread{
private String name ;
private int time ;
public Player(String name,int time){
this.name = name ;
this.time = time ;
}
public void run(){
System.out.println("玩家:" + name + " 出发了!");
try{
//让当前线程休眠time毫秒数
Thread.sleep(time);
}
catch(Exception e){
}
System.out.println("玩家:" + name + ":" + time + " 到了!");
}
}
守护线程
class ThreadDemo3 {
public static void main(String[] args) {
Room r1 = new Room("no1",5000);
Waiter w = new Waiter();
//设置线程为守护线程
//w.setDaemon(true);
r1.start();
w.start();
}
}
class Room extends Thread{
private String no ;
private int time ;
public Room(String no,int time){
this.no = no ;
this.time = time ;
}
public void run(){
System.out.println(no + "号房间正在唱歌!");
try{
Thread.sleep(time);
}
catch(Exception e){
}
System.out.println(no + "号房间买单了,走人了!");
}
}
//服务员
class Waiter extends Thread{
public Waiter(){
this.setDaemon(true);
}
public void run(){
while(true){
System.out.println(new java.util.Date());
try{
Thread.sleep(1000);
}
catch(Exception e){
}
}
}
}
class ThreadDemo4 {
public static void main(String[] args) {
Saler s1 = new Saler("老张");
Saler s2 = new Saler("老王");
s1.start();
s2.start();
}
}
class Saler extends Thread{
//锁
static Object lock = new Object();
//票数
static int tickets = 100 ;
private String name ;
public Saler(String name){
this.name = name ;
}
public void run(){
synchronized(lock){
while(tickets > 0){
int currTicket = tickets ;
tickets = tickets - 1 ;
System.out.println(name + " : " + currTicket);
}
}
}
}
class ThreadDemo5 {
public static void main(String[] args) {
Saler s1 = new Saler("==>老张");
Saler s2 = new Saler("=====>老王");
Saler s3 = new Saler("===========>老赵");
s1.start();
s2.start();
s3.start();
}
}
class Saler extends Thread{
//锁
static Object lock = new Object();
//票数
static int tickets = 100 ;
private String name ;
public Saler(String name){
this.name = name ;
}
public void run(){
while(true){
int tick = getTicket();
if(tick > 0){
System.out.println(name + " : " + tick);
}
else{
return ;
}
}
}
//取票
public int getTicket(){
//同步代码块
synchronized(lock){
int currTicket = tickets ;
tickets -- ;
return currTicket ;
}
}
}
class ThreadDemo6 {
public static void main(String[] args) {
Saler s1 = new Saler("==>老张");
Saler s2 = new Saler("=====>老王");
s1.start();
s2.start();
}
}
class Saler extends Thread{
//票数
static int tickets = 100 ;
private String name ;
public Saler(String name){
this.name = name ;
}
public void run(){
while(true){
int tick = getTicket();
if(tick > 0){
System.out.println(name + " : " + tick);
}
else{
return ;
}
}
}
//同步方法
public static synchronized int getTicket(){
//同步代码块
int currTicket = tickets ;
tickets -- ;
return currTicket ;
}
}
class ThreadDemo7 {
public static void main(String[] args) {
TicketPool pool = new TicketPool();
Saler s1 = new Saler("Marry" , pool);
Saler s2 = new Saler("======>john" , pool);
s1.start();
s2.start();
}
}
//票池
class TicketPool{
private int tickets = 100 ;
//从票池取票
public synchronized int getTicket(){
int ticket = tickets ;
tickets -- ;
return ticket ;
}
}
//售票员
class Saler extends Thread{
private TicketPool pool ;
private String name ;
public Saler(String name , TicketPool pool){
this.name = name ;
this.pool = pool ;
}
public void run(){
while(true){
int no = pool.getTicket();
if(no > 0){
System.out.println(name + " : " + no);
}
else{
return ;
}
}
}
}
jar
------------------
1.打包方式一
jar cvf xxx.jar Xxx.class yyy.class //将指定的class文件导入到jar中
2.打包方式二
jar cvf xxx.jar -C dir/ . //将某个目录下的所有文件打入到jar中
3.查看jar文件
jar -tf xxx.jar
4.运行jar中的类
java -cp xxx.jar xx.x.x.x.Xxxx //后面跟完整类名
5.指定清单文件(xxx.jar/META-INF/MENIFEST.MF)的入口类.
语法:jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
jar -cvfe classess.jar com.it18zhang.java.PackageDemo1 -C classes/ .
6.如果jar中的清单文件含有入口点(Main-Class),可以使用如下命令直接执行程序
java -jar classess.jar
完整过程
------------------
1.编写java源文件
..
2.编译java源文件,生成.class文件,指定目录
mkdir test2/classes //存放class文件
cd test2/src //存放源代码
javac -d ..\classes HelloWorld.java //这条命令的执行是在src下,指定编译的输出目录为src\classes,源文件的路径名下的主程序入口。
tree /F //进到classes目录下,执行该条命令
3.运行java程序
cd d:\
java -cp d:\test2\classes com.it18zhang.java.HelloWorld
4.打包jar文件
f : 指定jar文件名
e : 指定入口点类(含有main函数的类).
cd d:\test2
jar cvfe classes.jar com.it18zhang.java.HelloWorld -C classes/ . //在d:\test2下,生成classes.jar
5.查看jar文件
jar -tf classes.jar
6.执行jar文件
java -jar classes.jar
相对路径
------------
cd java //相对于当前目录下
绝对路径
------------
cd d:\java\classes
对线程
--------------------
进程 :运行时概念,运行的应用程序。进程间不能共享内存。进程间通信需要用到socket
线程 :应用程序内部并发执行的代码段,共享内存。
宏观:
--------------
CPU : (轮询)、多核(有多个CPU内核,而每个CPU是独立的存储单元。)
较真 : 很难精准控制,执行的先后顺序。
Thread:
--------------
java.lang.Thread
yield :放弃cpu抢占权,有谦让之意.
join :等指定的线程执行完之后继续运行。()
sleep :静态方法,让线程休眠毫秒数。
daemon :守护线程.如果应用程序剩余的线程都是守护线程,则程序结束。
其实一个栈(运行时概念)就是一个线程
锁
-----------------
任意一个对象都可以是锁。信号灯,参照物。
同步代码块:
synchronized(lock){...}
同步方法:非静态同步方法以当前对象作为锁旗标
public synchronized void xxx(){...}
同步方法:静态同步方法以当前类作为锁旗标
售票
----------------
100
线程安全: